c sharp socket编程简单例子

Socket programming simple example in c sharp

我在套接字编程中创建了一个简单的应用程序。我认为这是实现这一目标的简单方法。所以这就是我分享这个的原因。 在这个程序中你可以创建服务器程序和客户端程序。您还可以从客户端和服务器发送和接收消息。 这是我的代码

服务器程序:-

class Program
    {
        private const int port = 4532;
        static void Main(string[] args)
        {                      

            IPEndPoint ip = new IPEndPoint(IPAddress.Any, 4532);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Bind(ip);
            socket.Listen(10);
            Console.WriteLine("Waiting for client");
            Socket client = socket.Accept();
            IPEndPoint clientIP = (IPEndPoint)client.RemoteEndPoint;
            Console.WriteLine(" >> Connected with" + clientIP.Address + "at port" + clientIP.Port);
            Console.WriteLine(" >> Accept connection from client");

            string welcome = "Welcome";
            byte[] data = new byte[1024];
            data = Encoding.ASCII.GetBytes(welcome);
            client.Send(data, data.Length, SocketFlags.None);
            Console.WriteLine("......");
            Console.Read();

        }

    }

客户端程序:-

class Program
    {
        static void Main(string[] args)
        {

            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 4532);
            Console.WriteLine("Client Started");
            try
            {
                socket.Connect(ip);
            }
            catch(SocketException e)
            {
                Console.WriteLine("Enable to connect");
            }
            Console.WriteLine("Conneted to server");

            byte[] data = new byte[1024];
            int receivedata = socket.Receive(data);
            string stringdata = Encoding.ASCII.GetString(data, 0, receivedata);
            Console.WriteLine(stringdata);
            Console.Read();
        }
    }

嗯,这并不完全正确。

注意Encoding.ASCII.GetBytes每次都会给你一个新的数组,所以new byte[1024]初始化是没有价值的,如果字符串更大,数组可能更大。

如果服务器发送超过 1024 的负载会怎样?如果您使用 XML 或 JSON 等结构化数据格式,客户端将截断消息,这将导致序列化错误。在 TCP 通信中,您需要定义一个协议来构建数据,以一种您的代码可以确定消息何时开始或结束的方式,例如每行一条消息或更复杂的东西,如 WebSocket 框架。

请注意,服务器将只接受一个客户端,发送欢迎并卡在 Console.Read。它应该在一个循环中监听更多的客户端,并为每个连接的客户端启动一个新线程或使用异步操作。客户端也一样,它应该循环监听消息。

考虑 async/await 进一步扩展您的示例。生产就绪的 TCP 服务器需要多线程才能适当扩展。

看看这个 asynchronous TCP server and client 的示例,尚未准备好生产,但足以证明缓冲区读取和异步操作的概念。