cSharp中的套接字编程简单示例

Posted

技术标签:

【中文标题】cSharp中的套接字编程简单示例【英文标题】:Socket programming simple example in c sharp 【发布时间】:2015-01-30 07:00:40 【问题描述】:

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

服务器程序:-

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();
        
    

【问题讨论】:

【参考方案1】:

嗯,这并不完全正确。

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

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

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

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

看一下asynchronous TCP server and client 的这个例子,它还没有准备好生产,但对于缓冲区读取和异步操作的概念证明来说已经足够了。

【讨论】:

以上是关于cSharp中的套接字编程简单示例的主要内容,如果未能解决你的问题,请参考以下文章

C# socket编程

Linux网络编程简单示例

C 中的 Windows 套接字编程

基于UDP协议的socket套接字编程

基于UDP协议的socket套接字编程 基于socketserver实现并发的socket编程

Linux 套接字编程中的 5 个隐患