通过TCP发送文本字符串?

时间:2013-03-11 18:37:40

标签: c# .net string tcp

我只是阅读并测试了this精彩文章的代码,以便了解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();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您提供的示例是一个简单的“镜像”,TCP服务器将客户端从其接收的数据发送回客户端。

您要发送的数据位于byteBuffer变量中(我相信您当前正在发送文本“1024”)。因此,不是使用“1024”初始化它,而是可以使用所需的XML序列化数据对其进行初始化。

相反,在客户端,不是将数据回送给客户端,而是可以在服务器端使用数据(即XML对象)执行任何操作。

答案 1 :(得分:2)

将我的评论转换为答案:

我强烈建议您使用WCF,而不是自己实现所有内容。在WCF中,您创建接口(服务合同)和实现(服务),框架将所有通信/协议详细信息抽象出来。

您可以使用WCF Duplex在服务器和客户端之间进行双向通信