• C# 之 Socket 简单入门示例


    这个例子只是简单实现了如何使用 Socket 类实现面向连接的通信。

    注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。在这个例子中,实际上还有很多问题没有解决,如消息边界问题、端口号是否被占用、消息命令的解析问题等。。

    下面是两个程序的代码,(两个程序均为控制台程序)

    先发服务端的(Server)完整代码如下:

    引入命名空间:

    1
    2
    3
    using System.Net.Sockets; 
    using System.Net; 
    using System.Threading; 

      完整代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    namespace SocketServer 
        class Program 
        
            private static byte[] result = new byte[1024]; 
            private static int myProt = 8885;   //端口 
            static Socket serverSocket; 
            static void Main(string[] args) 
            
                //服务器IP地址 
                IPAddress ip = IPAddress.Parse("127.0.0.1"); 
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
                serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口 
                serverSocket.Listen(10);    //设定最多10个排队连接请求 
                Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString()); 
                //通过Clientsoket发送数据 
                Thread myThread = new Thread(ListenClientConnect); 
                myThread.Start(); 
                Console.ReadLine(); 
            
       
            /// <summary> 
            /// 监听客户端连接 
            /// </summary> 
            private static void ListenClientConnect() 
            
                while (true
                
                    Socket clientSocket = serverSocket.Accept(); 
                    clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello")); 
                    Thread receiveThread = new Thread(ReceiveMessage); 
                    receiveThread.Start(clientSocket); 
                
            
       
            /// <summary> 
            /// 接收消息 
            /// </summary> 
            /// <param name="clientSocket"></param> 
            private static void ReceiveMessage(object clientSocket) 
            
                Socket myClientSocket = (Socket)clientSocket; 
                while (true
                
                    try 
                    
                        //通过clientSocket接收数据 
                        int receiveNumber = myClientSocket.Receive(result); 
                        Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber)); 
                    
                    catch(Exception ex) 
                    
                        Console.WriteLine(ex.Message); 
                        myClientSocket.Shutdown(SocketShutdown.Both); 
                        myClientSocket.Close(); 
                        break
                    
                
            
        

      

    以上是服务端(server)的完整代码。

    客户端(Client)的完整代码如下:

    引入命名空间:

    1
    2
    3
    using System.Net; 
    using System.Net.Sockets; 
    using System.Threading; 

      完整代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    namespace SocketClient 
        class Program 
        
            private static byte[] result = new byte[1024]; 
            static void Main(string[] args) 
            
                //设定服务器IP地址 
                IPAddress ip = IPAddress.Parse("127.0.0.1"); 
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
                try 
                
                    clientSocket.Connect(new IPEndPoint(ip, 8885)); //配置服务器IP与端口 
                    Console.WriteLine("连接服务器成功"); 
                
                catch 
                
                    Console.WriteLine("连接服务器失败,请按回车键退出!"); 
                    return
                
                //通过clientSocket接收数据 
                int receiveLength = clientSocket.Receive(result); 
                Console.WriteLine("接收服务器消息:{0}",Encoding.ASCII.GetString(result,0,receiveLength)); 
                //通过 clientSocket 发送数据 
                for (int i = 0; i < 10; i++) 
                
                    try 
                    
                        Thread.Sleep(1000);    //等待1秒钟 
                        string sendMessage = "client send Message Hellp" + DateTime.Now; 
                        clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage)); 
                        Console.WriteLine("向服务器发送消息:{0}" + sendMessage); 
                    
                    catch 
                    
                        clientSocket.Shutdown(SocketShutdown.Both); 
                        clientSocket.Close(); 
                        break
                    
                
                Console.WriteLine("发送完毕,按回车键退出"); 
                Console.ReadLine(); 
            
        

      编译成功后,先运行 服务端(server),再运行客户端(client)即可达到通信效果。

    效果如下图:

    该程序已在局域网测试通过。(192.168.X.X)

  • 相关阅读:
    什么样的人适合边打工边创业?
    手机市场分析
    《这个男人来自地球》台词
    关系网成网络盈利模式 LinkedIn网站探秘
    第二届手机应用大赛“金枝奖”评选
    乔布斯的平静让人不寒而栗
    发展移动互联网需理清商业模式
    好想看故乡夏夜的天空
    AdoHelper能否改写成单例模式?
    GMail邀请发放处
  • 原文地址:https://www.cnblogs.com/ZaraNet/p/9598411.html
Copyright © 2020-2023  润新知