欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-03-03 08:32:35
这个例子只是简单实现了如何使用 socket 类实现面向连接的通信。 注意:此例子的目的只是为了说明用套接字写程序的大概思路,而不是实际项目中的使用程序。在这个例子中,实...

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

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

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

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

引入命名空间:

using system.net.sockets; 
using systemnet; 
using systemthreading; 

完整代码如下:

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 = ipaddressparse("1"); 
      serversocket = new socket(addressfamilyinternetwork, sockettypestream, protocoltypetcp); 
      serversocketbind(new ipendpoint(ip, myprot)); //绑定ip地址:端口 
      serversocketlisten(10);  //设定最多10个排队连接请求 
      consolewriteline("启动监听{0}成功", serversocketlocalendpointtostring()); 
      //通过clientsoket发送数据 
      thread mythread = new thread(listenclientconnect); 
      mythreadstart(); 
      consolereadline(); 
    } 
 
    /// <summary> 
    /// 监听客户端连接 
    /// </summary> 
    private static void listenclientconnect() 
    { 
      while (true) 
      { 
        socket clientsocket = serversocketaccept(); 
        clientsocketsend(encodingasciigetbytes("server say hello")); 
        thread receivethread = new thread(receivemessage); 
        receivethreadstart(clientsocket); 
      } 
    } 
 
    /// <summary> 
    /// 接收消息 
    /// </summary> 
    /// <param name="clientsocket"></param> 
    private static void receivemessage(object clientsocket) 
    { 
      socket myclientsocket = (socket)clientsocket; 
      while (true) 
      { 
        try 
        { 
          //通过clientsocket接收数据 
          int receivenumber = myclientsocketreceive(result); 
          consolewriteline("接收客户端{0}消息{1}", myclientsocketremoteendpointtostring(), encodingasciigetstring(result, 0, receivenumber)); 
        } 
        catch(exception ex) 
        { 
          consolewriteline(exmessage); 
          myclientsocketshutdown(socketshutdownboth); 
          myclientsocketclose(); 
          break; 
        } 
      } 
    } 
  } 
} 

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

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

引入命名空间:

using systemnet; 
using systemnetsockets; 
using systemthreading; 

完整代码:

namespace socketclient 
{ 
  class program 
  { 
    private static byte[] result = new byte[1024]; 
    static void main(string[] args) 
    { 
      //设定服务器ip地址 
      ipaddress ip = ipaddressparse("1"); 
      socket clientsocket = new socket(addressfamilyinternetwork, sockettypestream, protocoltypetcp); 
      try 
      { 
        clientsocketconnect(new ipendpoint(ip, 8885)); //配置服务器ip与端口 
        consolewriteline("连接服务器成功"); 
      } 
      catch 
      { 
        consolewriteline("连接服务器失败,请按回车键退出!"); 
        return; 
      } 
      //通过clientsocket接收数据 
      int receivelength = clientsocketreceive(result); 
      consolewriteline("接收服务器消息:{0}",encodingasciigetstring(result,0,receivelength)); 
      //通过 clientsocket 发送数据 
      for (int i = 0; i < 10; i++) 
      { 
        try 
        { 
          threadsleep(1000);  //等待1秒钟 
          string sendmessage = "client send message hellp" + datetimenow; 
          clientsocketsend(encodingasciigetbytes(sendmessage)); 
          consolewriteline("向服务器发送消息:{0}" + sendmessage); 
        } 
        catch 
        { 
          clientsocketshutdown(socketshutdownboth); 
          clientsocketclose(); 
          break; 
        } 
      } 
      consolewriteline("发送完毕,按回车键退出"); 
      consolereadline(); 
    } 
  } 
} 

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

效果如下图:

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

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

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。