• (转)C# Socket简单例子(服务器与客户端通信)


    本文转载自:http://blog.csdn.net/andrew_wx/article/details/6629721

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

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

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

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

    引入命名空间:

    [csharp] view plaincopyprint?
     
    1. using System.Net.Sockets;  
    2. using System.Net;  
    3. using System.Threading;  

    完整代码如下:

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

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

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

    引入命名空间:

    [csharp] view plaincopyprint?
     
    1. using System.Net;  
    2. using System.Net.Sockets;  
    3. using System.Threading;  

    完整代码:

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


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

    效果如下图:

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

    若编译失败,可到下面的地址下载项目文件:

    http://download.csdn.net/source/3465765

  • 相关阅读:
    排序
    git常用操作_分支合并_新建工程等
    ibatis 中调用存储过程
    IDEA试用期结束激活问题
    kafka本地工程的调用说明
    python yield 和 yield from用法总结
    ubuntu14.06 Lts开启ssh服务
    QT-1-环境搭建QT5.4.1&MinGW4.9.1
    虚拟机Ping不通主机解决
    CRC类(处理ITU表)
  • 原文地址:https://www.cnblogs.com/wpcnblog/p/3909709.html
Copyright © 2020-2023  润新知