C#异步传输字符串服务端的实现当程序越来越复杂的时候,就需要越来越高的抽象,所以从现在起我们不再把所有的代码全部都扔进Main()里,这次我创建了一个RemoteClient类,它对于服务端获取到的TcpClient进行了一个包装:
C#异步传输字符串服务端的实现实例:
- public class RemoteClient {
- private TcpClient client;
- private NetworkStream streamToClient;
- private const int BufferSize = 8192;
- private byte[] buffer;
- private RequestHandler handler;
- //C#异步传输字符串服务端的实现
- public RemoteClient(TcpClient client) {
- this.client = client;
- // 打印连接到的客户端信息
- Console.WriteLine("\nClient Connected!{0} <-- {1}",
- client.Client.LocalEndPoint,
- client.Client.RemoteEndPoint);
- // 获得流
- streamToClient = client.GetStream();
- buffer = new byte[BufferSize];
- // 设置RequestHandler
- handler = new RequestHandler();
- // 在构造函数中就开始准备读取
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToClient.BeginRead(buffer,
- 0, BufferSize, callBack, null);
- }
- // 再读取完成时进行回调
- private void ReadComplete(IAsyncResult ar) {
- int bytesRead = 0;
- try {
- lock (streamToClient) {
- bytesRead = streamToClient.EndRead(ar);
- Console.WriteLine("Reading data, {0} bytes ...", bytesRead);
- }
- if (bytesRead == 0) throw new Exception("读取到0字节");
- //C#异步传输字符串服务端的实现
- string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
- Array.Clear(buffer,0,buffer.Length);
- // 清空缓存,避免脏读
- string[] msgArray = handler.GetActualString(msg);
- // 获取实际的字符串
- // 遍历获得到的字符串
- foreach (string m in msgArray) {
- Console.WriteLine("Received: {0}", m);
- string back = m.ToUpper();
- // 将得到的字符串改为大写并重新发送
- byte[] temp = Encoding.Unicode.GetBytes(back);
- streamToClient.Write(temp, 0, temp.Length);
- streamToClient.Flush();
- Console.WriteLine("Sent: {0}", back);
- } //C#异步传输字符串服务端的实现
- // 再次调用BeginRead(),完成时调用自身,形成无限循环
- lock (streamToClient) {
- AsyncCallback callBack =
- new AsyncCallback(ReadComplete);
- streamToClient.BeginRead(buffer,
- 0, BufferSize, callBack, null);
- }
- } catch(Exception ex) {
- if(streamToClient!=null)
- streamToClient.Dispose();
- client.Close();
- Console.WriteLine(ex.Message);
- // 捕获异常时退出程序
- }
- }
- }
随后,我们在主程序中仅仅创建TcpListener类型实例,由于RemoteClient类在构造函数中已经完成了初始化的工作,所以我们在下面的while循环中我们甚至不需要调用任何方法:
- class Server {
- static void Main(string[] args) {
- 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 ...");
- while (true) {
- // 获取一个连接,同步方法,在此处中断
- TcpClient client = listener.AcceptTcpClient();
- RemoteClient wapper = new RemoteClient(client);
- }
- } //C#异步传输字符串服务端的实现
- }
好了,服务端的实现现在就完成了。
C#异步传输字符串服务端的实现方面内容就向你介绍到这里,希望对你了解和学习C#异步传输字符串有所帮助。
【编辑推荐】