3

これはstackoverflowで見つけることができませんでした。数か月前に書いた例がありましたが、今も見つかりません。

基本的に、クライアントからサーバーに byte[] を送信し、それをサーバー ウィンドウに表示してから、その中のデータを操作する予定です。ただし、受信しているデータは毎回クリーニングされていません。例:

「ABCDEF」を送信 サーバーは「ABCDEF」を表示 「GHI」を送信 サーバーは「GHIDEF」を表示

私がどこから来ているのかわかると思いますが、必要なのは byte[] 配列をきれいにする方法だけです。

次のステップは、使用する予定のバイトのみを読み取ることです。そのため、現時点では X 量のデータしか使用していませんが、実際には必要以上に多くのデータを受信して​​います。最後に余分なデータを破棄します。

これについてどうすればよいか、誰にもアドバイスできますか?

私のコードは以下のとおりです。

クライアント:

    static void Main(string[] args)
    {

        try
        {
            ASCIIEncoding encoding = new ASCIIEncoding();
            Console.WriteLine("Welcome to Josh's humble server.");
            IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 2000);
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
            sock.Bind(ipEnd);
            sock.Listen(100);
            Socket clientSock = sock.Accept();
            byte[] mabytes = encoding.GetBytes("Test");
            clientSock.Send(mabytes);
            Console.WriteLine("Hmmm, data sent!");
            Console.ReadLine();
            Console.WriteLine(encoding.GetString(mabytes));
            Console.ReadLine();
            byte[] buffer = encoding.GetBytes("server message");
            while (true)
            {
                clientSock.Receive(buffer);
                Console.WriteLine(encoding.GetString(buffer));
            }


        }
        catch (Exception ex)
        {
            Console.WriteLine(Convert.ToString(ex));
            Console.ReadLine();
        }

    }

サーバ:

    static void Main(string[] args)
    {
        ASCIIEncoding encoding = new ASCIIEncoding();
        IPAddress ip = IPAddress.Parse("127.0.0.1");
        Console.WriteLine("Welcome to Josh's humble client.");
        Console.ReadLine();
        IPEndPoint ipEnd = new IPEndPoint(ip, 2000);
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP);
        sock.Connect(ipEnd);
        while (true)
        {
            Console.WriteLine("Please enter a message:\n");
            byte[] mabyte = encoding.GetBytes(Console.ReadLine());
            sock.Send(mabyte);
            Console.WriteLine("Sent Data");
        }
    }

前もって感謝します

4

1 に答える 1

7

データを取得するために使用clientSock.Receive(buffer);しますが、戻り値を確認することはありません。バッファの長さよりも小さく読み取られる場合があります。より正しい方法は次のとおりです。

int len = clientSock.Receive(buffer);
Console.WriteLine(encoding.GetString(buffer,0,len));

またbyte[] buffer = encoding.GetBytes("server message");、バイトを割り当てるために使用するのは良い方法ではありません。次のようなものを使用しますbyte[] buffer = new byte[1024*N];

- 編集 -

マルチバイト文字が連続した読み取り間で分割されている場合、このアプローチでも問題になる可能性があります。より良い方法は、TcpClient を使用し、そのストリームをラップしてnew StreamReader(tcpClient.GetStream())行ごとに読み取ることです。

于 2012-11-09T21:06:12.750 に答える