温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C#中怎么实现同步传输字符串

发布时间:2021-07-19 15:36:56 来源:亿速云 阅读:81 作者:Leah 栏目:编程语言

C#中怎么实现同步传输字符串,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

C#服务端程序实例:

//C#服务端程序  class Server {  static void Main(string[] args) {  const int BufferSize = 8192;// 缓存大小,8192字节   Console.WriteLine("Server is running ... ");  IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });  TcpListener listener = new TcpListener(ip, 8500);   listener.Start();   // 开始侦听  Console.WriteLine("Start Listening ...");  //C#服务端程序  // 获取一个连接,中断方法  TcpClient remoteClient = listener.AcceptTcpClient();  // 打印连接到的客户端信息  Console.WriteLine("Client Connected!{0} <-- {1}",  remoteClient.Client.LocalEndPoint,   remoteClient.Client.RemoteEndPoint);   // 获得流,并写入buffer中  NetworkStream streamToClient = remoteClient.GetStream();  byte[] buffer = new byte[BufferSize];  int bytesRead = streamToClient.Read(buffer, 0, BufferSize);  Console.WriteLine("Reading data, {0} bytes ...", bytesRead);  //C#服务端程序  // 获得请求的字符串  string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);  Console.WriteLine("Received: {0}", msg);  //C#服务端程序  // 按Q退出  }  }

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

// 获取字符串  byte[] buffer = new byte[BufferSize];  int bytesRead;  // 读取的字节数  MemoryStream msStream = new MemoryStream();  do {  bytesRead = streamToClient.Read(buffer, 0, BufferSize);  msStream.Write(buffer, 0, bytesRead);  } while (bytesRead > 0);  //C#服务端程序  buffer = msStream.GetBuffer();  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#中怎么实现同步传输字符串问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI