C# Socket的TCP通讯的实例代码

2019-12-30 15:18:58刘景俊

(4)接收客户端发送过来的数据(用缓存来接收)


byte[] buffer = new byte[BufferSize]; // BufferSize为缓存的大小

 int bytesRead; 

 try

 {

  lock (streamToClient)//为了保证数据的完整性以及安全性 锁定数据流

   {

     bytesRead = streamToClient.Read(buffer, 0, BufferSize);

} 

(5)向连接的客户端发送数据


lock (streamToClient)

           {

           streamToClient.Write(buffer, 0, buffer.Length);//buffer为发送的字符数组         

} 

 (6)释放数据流和TcpClient(以便下次的数据以及客户端的收发)


streamToClient.Dispose();//释放数据流中的数据

 remoteClient.Close();//释放TcpClient实例 

客户端

(1)   连接服务器


TcpClient tcp = new TcpClient();

tcp.Connect(IP,Port);//根据服务器的IP地址和侦听的端口连接

if (tcp.Connected)

{

//连接成功的消息机制 详细见DEMO

ShowGetData("成功连接上了服务器:", this.strIP.Text.ToString());
 

 } 

这里需要注意的是,不管是使用有参数的构造函数与服务器连接,或者是通过Connect()方法与服务器建立连接,都是同步方法(或者说是阻塞的,英文叫block)。它的意思是说,客户端在与服务端连接成功、从而方法返回,或者是服务端不存、从而抛出异常之前,是无法继续进行后继操作的。这里还有一个名为BeginConnect()的方法,用于实施异步的连接,这样程序不会被阻塞,可以立即执行后面的操作,这是因为可能由于网络拥塞等问题,连接需要较长时间才能完成。网络编程中有非常多的异步操作,凡事都是由简入难,关于异步操作,我们后面再讨论,现在只看同步操作。

(2)   建立连接服务端的数据流


NetworkStream streamToServer = tcp.GetStream(); 

(3)   接收和发送数据


//发送字符串

byte[] buffer = Encoding.Unicode.GetBytes(msg); //msg为发送的字符串  

 try

     {

       lock (streamToServer)
      {

      streamToServer.Write(buffer, 0, buffer.Length);   // 发往服务器

       }

     //接收字符串
       buffer = new byte[BufferSize];
       lock (streamToServer)

      {

        bytesRead = streamToServer.Read(buffer, 0, BufferSize);

      }

} 

1.2.      异步

相对于同步,异步中的连接,接收和发送数据的方法都不一样,都有一个回调函数,就是即使不能连接或者接收不到数据,程序还是会一直执行下去,如果连接上了或者接到数据,程序会回到这个回调函数的地方重新往下执行。详细见下面:

服务器: