C#服务端程序实现同步传输字符串浅析

开发 后端
C#服务端程序实现同步传输字符串是如何办到的呢?C#服务端程序实现同步传输字符串需要注意的是什么呢?那么本文就向你介绍这方面的内容。

C#服务端程序实现同步传输字符串问题的由来:我们可以在TcpClient上调用GetStream()方法来获得连接到远程计算机的流。注意这里我用了远程这个词,当在客户端调用时,它得到连接服务端的流;当在服务端调用时,它获得连接客户端的流。接下来我们来看一下代码,我们先看服务端(注意这里没有使用do/while循环):

C#服务端程序实例:

  1. //C#服务端程序  
  2. class Server {  
  3. static void Main(string[] args) {  
  4. const int BufferSize = 8192;// 缓存大小,8192字节  
  5.  
  6. Console.WriteLine("Server is running ... ");  
  7. IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });  
  8. TcpListener listener = new TcpListener(ip, 8500);  
  9.  
  10. listener.Start();   // 开始侦听  
  11. Console.WriteLine("Start Listening ...");  
  12. //C#服务端程序  
  13. // 获取一个连接,中断方法  
  14. TcpClient remoteClient = listener.AcceptTcpClient();  
  15. // 打印连接到的客户端信息  
  16. Console.WriteLine("Client Connected!{0} <-- {1}",  
  17. remoteClient.Client.LocalEndPoint,  
  18.  remoteClient.Client.RemoteEndPoint);  
  19.  
  20. // 获得流,并写入buffer中  
  21. NetworkStream streamToClient = remoteClient.GetStream();  
  22. byte[] buffer = new byte[BufferSize];  
  23. int bytesRead = streamToClient.Read(buffer, 0, BufferSize);  
  24. Console.WriteLine("Reading data, {0} bytes ...", bytesRead);  
  25. //C#服务端程序  
  26. // 获得请求的字符串  
  27. string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);  
  28. Console.WriteLine("Received: {0}", msg);  
  29. //C#服务端程序  
  30. // 按Q退出  
  31. }  

这段C#服务端程序的上半部分已经很熟悉了,我就不再解释。remoteClient.GetStream()方法获取到了连接至客户端的流,然后从流中读出数据并保存在了buffer缓存中,随后使用Encoding.Unicode.GetString()方法,从缓存中获取到了实际的字符串。***将字符串打印在了控制台上。这段代码有个地方需要注意:在能够读取的字符串的总字节数大于BufferSize的时候会出现字符串截断现象,因为缓存中的数目总是有限的,而对于大对象,比如说图片或者其它文件来说,则必须采用“分次读取然后转存”这种方式,比如这样:

  1. // 获取字符串  
  2. byte[] buffer = new byte[BufferSize];  
  3. int bytesRead;  // 读取的字节数  
  4. MemoryStream msStream = new MemoryStream();  
  5. do {  
  6. bytesRead = streamToClient.Read(buffer, 0, BufferSize);  
  7. msStream.Write(buffer, 0, bytesRead);  
  8. while (bytesRead > 0);  
  9. //C#服务端程序  
  10. buffer = msStream.GetBuffer();  
  11. string msg = Encoding.Unicode.GetString(buffer); 

这里我没有使用这种方法,一个是因为不想关注在太多的细节上面,一个是因为对于字符串来说,8192字节已经很多了,我们通常不会传递这么多的文本。当使用Unicode编码时,8192字节可以保存4096个汉字和英文字符。使用不同的编码方式,占用的字节数有很大的差异,在本文***面,有一段小程序,可以用来测试Unicode、UTF8、ASCII三种常用编码方式对字符串编码时,占用的字节数大小。

现在对客户端不做任何修改,然后运行先运行服务端,再运行客户端。结果我们会发现这样一件事:服务端再打印完“Client Connected!127.0.0.1:8500 <-- 127.0.0.1:xxxxx”之后,再次被阻塞了,而没有输出“Reading data, {0} bytes ...”。可见,与AcceptTcpClient()方法类似,这个Read()方法也是同步的,只有当客户端发送数据的时候,服务端才会读取数据、运行此方法,否则它便会一直等待。

C#服务端程序的基本内容就向你介绍到这里,希望对你了解和学习C#服务端程序有所帮助。

【编辑推荐】

  1. C#服务端端口侦听浅析
  2. C#服务端与客户端连接实现浅析
  3. C#服务端与客户端连接实现浅谈
  4. C#服务端与客户端通信浅析
  5. C#服务端与客户端通信详解
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-21 16:37:54

C#客户端程序

2009-08-21 14:25:23

C#异步传输字符串

2009-08-21 14:33:15

C#异步传输字符串

2009-08-21 15:22:56

端口侦听

2009-08-21 15:36:41

服务端与客户端

2009-08-11 10:26:49

C#算法C#字符串反转

2009-08-21 15:59:22

服务端与客户端通信

2009-09-01 17:50:23

C#截取字符串

2009-09-02 13:41:57

C#字符串操作

2009-08-21 15:54:40

服务端与客户端

2009-08-21 17:39:20

服务器端程序C#网络编程

2009-09-03 18:45:06

GridView格式化

2009-08-21 17:53:25

C#网络编程客户端程序

2009-08-20 14:31:55

C#正则表达式字符串

2009-08-14 11:00:16

C#创建Windows

2009-08-28 16:03:15

C#程序实现鼠标移动

2009-08-21 16:14:52

服务端与客户端通信

2009-08-07 14:46:59

C#匹配字符串

2009-08-07 14:22:56

C#字符串搜索

2009-08-07 14:34:33

C#模式字符串
点赞
收藏

51CTO技术栈公众号