4

TCP クライアントとサーバーを理解するために、この素​​晴らしい記事のコードを読んでテストしました。

次に、TCP クライアントから TCP サーバーに文字列を送信するために必要な、非常に単純なことを行う必要があります (希望します) 。

文字列はシリアル化されたオブジェクトであり、実際には XML です。

このコードを TCP クライアントと TCP サーバーのどこに含める必要があるのか​​ わかりません。

TCP クライアント:

static void Main(string[] args)
    {

        while (true)
        {
            String server = "192.168.2.175"; // args[0]; // Server name or IP address

            // Convert input String to bytes
            byte[] byteBuffer = Encoding.ASCII.GetBytes("1024"); // Encoding.ASCII.GetBytes(args[1]);

            // Use port argument if supplied, otherwise default to 8080
            int servPort = 1311;  // (args.Length == 3) ? Int32.Parse(args[2]) : 8080;//7 ;

            TcpClient client = null;
            NetworkStream netStream = null;

            try
            {
                // Create socket that is connected to server on specified port
                client = new TcpClient(server, servPort);

                Console.WriteLine("Connected to server... sending echo string");

                netStream = client.GetStream();

                // Send the encoded string to the server
                netStream.Write(byteBuffer, 0, byteBuffer.Length);

                Console.WriteLine("Sent {0} bytes to server...", byteBuffer.Length);

                int totalBytesRcvd = 0; // Total bytes received so far
                int bytesRcvd = 0; // Bytes received in last read

                // Receive the same string back from the server
                while (totalBytesRcvd < byteBuffer.Length)
                {
                    if ((bytesRcvd = netStream.Read(byteBuffer, totalBytesRcvd,
                    byteBuffer.Length - totalBytesRcvd)) == 0)
                    {
                        Console.WriteLine("Connection closed prematurely.");
                        break;
                    }
                    totalBytesRcvd += bytesRcvd;
                }
                Console.WriteLine("Received {0} bytes from server: {1}", totalBytesRcvd,
                Encoding.ASCII.GetString(byteBuffer, 0, totalBytesRcvd));

            }
            catch (Exception ex)
            {
                // http://stackoverflow.com/questions/2972600/no-connection-could-be-made-because-the-target-machine-actively-refused-it
                Console.WriteLine(ex.Message);
            }
            finally
            {
                if (netStream != null)
                    netStream.Close();
                if (client != null)
                    client.Close();
            }
            Thread.Sleep(1000);
        }

    }

TCP サーバー

class Program
{

    private const int BUFSIZE = 32; // Size of receive buffer

    static void Main(string[] args)
    {


        int servPort = 1311; // (args.Length == 1) ? Int32.Parse(args[0]) : 8080;

        TcpListener listener = null;

        try
        {
            // Create a TCPListener to accept client connections
            listener = new TcpListener(IPAddress.Any, servPort);
            listener.Start();
        }
        catch (SocketException se)
        {
            // IPAddress.Any
            Console.WriteLine(se.ErrorCode + ": " + se.Message);
            //Console.ReadKey();
            Environment.Exit(se.ErrorCode);

        }

        byte[] rcvBuffer = new byte[BUFSIZE]; // Receive buffer
        int bytesRcvd; // Received byte count
        for (; ; )
        { // Run forever, accepting and servicing connections
            // Console.WriteLine(IPAddress.Any);
            TcpClient client = null;
            NetworkStream netStream = null;
            //Console.WriteLine(IPAddress.None);

            try
            {
                client = listener.AcceptTcpClient(); // Get client connection
                netStream = client.GetStream();
                Console.Write("Handling client - ");

                // Receive until client closes connection, indicated by 0 return value
                int totalBytesEchoed = 0;
                while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0)
                {
                    netStream.Write(rcvBuffer, 0, bytesRcvd);
                    totalBytesEchoed += bytesRcvd;
                }
                Console.WriteLine("echoed {0} bytes.", totalBytesEchoed);

                // Close the stream and socket. We are done with this client!
                netStream.Close();
                client.Close();

            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                netStream.Close();
            }
        }
    }
}
4

2 に答える 2

2

コメントを回答に変換する:

すべてを自分で実装するのではなく、WCF を使用することを強くお勧めします。WCF では、インターフェイス (サービス コントラクト) と実装 (サービス) を作成し、フレームワークがすべての通信/プロトコルの詳細を抽象化します。

WCF Duplexを使用して、サーバーとクライアント間の双方向通信を行うことができます

于 2013-03-11T19:54:31.990 に答える
2

あなたが与える例は、TCPサーバーがクライアントから受信したデータをクライアントに送り返す単純な「ミラー」です。

送信したいデータは byteBuffer 変数にあります (現在、テキスト「1024」を送信していると思います)。したがって、「1024」で初期化する代わりに、必要な XML シリアル化データで初期化できます。

逆に、クライアント側では、データをクライアントにエコー バックする代わりに、サーバー側でデータ、つまり XML オブジェクトを使用して必要なことを簡単に行うことができます。

于 2013-03-11T18:50:10.547 に答える