zoukankan      html  css  js  c++  java
  • 使用 AcceptTcpClientAsync 进行 异步 操作

     转自:https://gist.github.com/jamesmanning/2622054

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Sockets;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication2
    {
        class Program
        {
            static void Main(string[] args)
            {
                StartListener();
                ConnectAsTcpClient();
                Console.ReadLine();
            }
    
            private static async void ConnectAsTcpClient()
            {
                using (var tcpClient = new TcpClient())
                {
                    Console.WriteLine("[Client] Connecting to server");
                    await tcpClient.ConnectAsync("127.0.0.1", 1234);
                    Console.WriteLine("[Client] Connected to server");
                    using (var networkStream = tcpClient.GetStream())
                    {
                        Console.WriteLine("[Client] Writing request {0}", ClientRequestString);
                        await networkStream.WriteAsync(ClientRequestBytes, 0, ClientRequestBytes.Length);
            
                        var buffer = new byte[4096];
                        var byteCount = await networkStream.ReadAsync(buffer, 0, buffer.Length);
                        var response = Encoding.UTF8.GetString(buffer, 0, byteCount);
                        Console.WriteLine("[Client] Server response was {0}", response);
                    }
                }
            }
    
            private static readonly string ClientRequestString = "Some HTTP request here";
            private static readonly byte[] ClientRequestBytes = Encoding.UTF8.GetBytes(ClientRequestString);
    
            private static readonly string ServerResponseString = "<?xml version="1.0" encoding="utf-8"?><document><userkey>key</userkey> <machinemode>1</machinemode><serial>0000</serial><unitname>Device</unitname><version>1</version></document>
    ";
            private static readonly byte[] ServerResponseBytes = Encoding.UTF8.GetBytes(ServerResponseString);
    
            private static async void StartListener()
            {
                var tcpListener = TcpListener.Create(1234);
                tcpListener.Start();
                var tcpClient = await tcpListener.AcceptTcpClientAsync();
                Console.WriteLine("[Server] Client has connected");
                using (var networkStream = tcpClient.GetStream())
                {
                    var buffer = new byte[4096];
                    Console.WriteLine("[Server] Reading from client");
                    var byteCount = await networkStream.ReadAsync(buffer, 0, buffer.Length);
                    var request = Encoding.UTF8.GetString(buffer, 0, byteCount);
                    Console.WriteLine("[Server] Client wrote {0}", request);
                    await networkStream.WriteAsync(ServerResponseBytes, 0, ServerResponseBytes.Length);
                    Console.WriteLine("[Server] Response has been written");
                }
            }
        }
    }
  • 相关阅读:
    如何使用Doxygen生成keil工程的代码文档 (how to use doxygen properly with keil)
    使用matlab画相交的平面
    转载:关于循环异步操作 Promise 实现,ES7 的 await 和 async
    小众软件:相见恨晚的 Windows 系统下的 cmd 的命令行替代者 Cmder(完美神器)
    Windows系统环境下Python脚本实现全局“划词复制”功能
    Ubuntu shell 命令行路径缩短
    shell查找数组是否有特定的值
    保存数据到文件
    左值与右值
    进程与线程的区别
  • 原文地址:https://www.cnblogs.com/wyt007/p/8857261.html
Copyright © 2011-2022 走看看