服务端监听

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleAppTcp
{class Program{private static readonly object _object = new object();static void Main(string[] args){TcpListener listener = null;try{listener = new TcpListener(System.Net.IPAddress.Parse("127.0.0.1"), 9866);listener.Start();Console.WriteLine("启动监听");Task.Run(() =>{while (true){lock (_object){listener.BeginAcceptTcpClient(new AsyncCallback((a) =>{TcpListener tcpListener = (TcpListener)a.AsyncState;TcpClient client = tcpListener.EndAcceptTcpClient(a);string ip = client.Client.RemoteEndPoint.ToString();Console.WriteLine("收到客户端连接" + ip);Task task = Task.Run(async () =>{NetworkStream stream = client.GetStream();              while (true){try{if (!stream.CanRead){continue;}//收到客户端消息List<byte> list=new List<byte>();do{Memory<byte> buffer3 = new byte[200];await stream.ReadAsync(buffer3);list.AddRange(buffer3.ToArray());} while (stream.DataAvailable);string msg = Encoding.Unicode.GetString(list.ToArray());msg = msg.TrimEnd('\0','\r','\n');Console.WriteLine("收到客户端"+ ip + "消息:" + msg);//发送消息到客户端string input = "王安石变法" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");Console.WriteLine("发送到" + ip + "客户端>" + input);ReadOnlyMemory<byte> buffer2 = Encoding.Unicode.GetBytes(input).AsMemory();await stream.WriteAsync(buffer2);await stream.FlushAsync();}catch (Exception ex){Console.WriteLine("读取客户端消息异常." + ex.Message);break;}//Thread.Sleep(50);}});}), listener);}Thread.Sleep(100);}});}catch (SocketException ex){Console.WriteLine("监听异常" + ex);}finally{//listener?.Stop();}Console.ReadLine();}}
}

客户端代码

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;namespace ConsoleAppTcpClient
{/// <summary>/// 客户端代码/// </summary>class Program{private static readonly object obj = new object();/// <summary>/// 是否继续连接了/// </summary>static bool isContinueConnect = false;static void Main(string[] args){Action action = null;//继续连接服务器Action continueConnect = () => {lock (obj) {if (!isContinueConnect){isContinueConnect = true;action();}                  }};action = () =>{TcpClient tcpClient = new TcpClient();tcpClient.BeginConnect(IPAddress.Parse("127.0.0.1"), 9866, a =>{TcpClient tcpClient = null;try{tcpClient = (TcpClient)a.AsyncState;tcpClient.EndConnect(a);Console.WriteLine("连接服务器成功");isContinueConnect = false;NetworkStream networkStream = tcpClient.GetStream();Task t1 = Task.Run(async () =>{while (true){try{if (!networkStream.CanWrite){continue;}//发送消息到服务器string input = "武松去九岭岗" + DateTime.Now.ToLongTimeString();Console.WriteLine("发送到服务器:" + input);ReadOnlyMemory<byte> buffer = Encoding.Unicode.GetBytes(input).AsMemory();await networkStream.WriteAsync(buffer);await networkStream.FlushAsync();Thread.Sleep(2000);}catch (Exception ex){Console.WriteLine("连接服务器异常" + ex.Message);continueConnect();break;}}                         });Task t2 = Task.Run(async () =>{while (true){try{if (!networkStream.CanRead){continue;}//收到服务器消息List<byte> list = new List<byte>();do{Memory<byte> buffer3 = new byte[200];await networkStream.ReadAsync(buffer3);list.AddRange(buffer3.ToArray());} while (networkStream.DataAvailable);string msg = Encoding.Unicode.GetString(list.ToArray());msg = msg.TrimEnd('\0', '\r', '\n');Console.WriteLine("收到服务器消息:" + msg);}catch (Exception ex){Console.WriteLine("连接服务器异常" + ex.Message);continueConnect();break;}}                            });                               }catch (Exception ex){Console.WriteLine(ex.Message + ",10秒后重新连接");Thread.Sleep(10000);action();}}, tcpClient);};          action();Console.ReadKey();}}
}

C# TCP异步通信TcpClient相关推荐

  1. TCP使用TcpClient连接发送指令

    //全局TcpClient tclient;/// <summary>/// 打开TCP连接/// </summary>/// <param name="ip& ...

  2. tcp 远程服务器,C#编程学习之使用TcpClient / BeginConnect测试远程服务器tcp端口连接-网络教程与技术 -亦是美网络...

    有时候经常需要对一些服务器的端口进行tcp连接测试,通常使用"telnet IP地址 端口号"的方式即可,不能说这种方式不可取,只是使用起来比较麻烦,本着简单好用的目的,不如我们自 ...

  3. JMeter测试TCP/IP Socket应用的性能

    摘要 本文描述了如何利用JMeter来测试TCP/IP Socket应用的性能.文章先对Socket作了一点简单介绍,然后提供并解释了两个样例Socket应用,最后介绍如何利用JMeter来对它们进行 ...

  4. C# 的TCPClient异步连接与异步读数据

    Socket的TCP通讯 一. socket的通讯原理 服务器端的步骤如下. (1)建立服务器端的Socket,开始侦听整个网络中的连接请求. (2)当检测到来自客户端的连接请求时,向客户端发送收到连 ...

  5. QT示例:基于TCP 点对多Socket通讯(server,clients)

    QT示例:基于TCP 点对多通讯(server,clients) 一.服务器server 二.客户端Client 下载:基于TCP 点对多Socket通讯 一.服务器server 因为对于客户端来说, ...

  6. 2.6-使用C#Winform开发Tcp/Udp网络小助手(含步骤和源码)

    一.界面设计 在做软件之前使用"软件界面设计工具"先设计并绘制出软件界面,方便在写代码之前确认"功能需求"以及"交互流程". 这里使用的软件 ...

  7. C# 中使用TCP连接设置超时问题

    在使用C#中用TCP连接去扫描IP的过程中,发现,TCP连接没有可以设置连接超时的方法,如果扫描到空的IP或连接失败,那要等20多秒,甚至更长, 我们可以重新去用Thread的join这个带参数的线程 ...

  8. qt:tcp通信工具(Client篇)

    1.说明 使用qt写一个类似网上常见的网络调试工具.此篇为Client端.下一遍再写Server端. 2.基本流程 Client端相对简单:创建QTcpSocket对象,为对象的readyRead,e ...

  9. MATLAB实现TCP/IP通信

    1.使用R2021a版本的函数 参考链接:MATLAB TCP t = tcpclient(address,port) t = tcpclient(address,port,Name,Value) 使 ...

  10. 糖儿飞教你学C++ Socket网络编程——18. MFC WinSock版的TCP通信程序

    在4.2节中使用Win32 API方法制作了一个TCP异步通信的程序,本节将4.2节的程序用MFC框架重新编写,改写后程序的界面如图6-15所示,功能与4.2节的程序完全相同. 图6-15 MFC版T ...

最新文章

  1. 结队-结队编程项目贪吃蛇-项目进度
  2. 坦白讲!90%的数据分析师都不合格!!
  3. 并发编程(四)__ConcurrentHashMap
  4. linux编译openssl
  5. hdu 5691 Sitting in Line
  6. PTA15、班级人员信息统计 (10 分)
  7. 白话 Golang pprof
  8. 【IT之路】LoadRunner系列-Win7 64bit下搭建Loadrunner11破解版
  9. 进程的同步与通信,进程与线程同步的区别,进程与线程通信的区别【转】
  10. 货币代码无法进行ALE通信
  11. 李宏毅机器学习hw1~4作业 强化点
  12. C语言程序设计第五版谭浩强课后答案 第五章习题答案
  13. 网络舆情监测在教育行业的必要性
  14. linux加载dl580网卡驱动,HP DL580G5安装centos下的阵列卡驱动
  15. java 正则拼音,用于匹配拼音的正则表达式
  16. 沃通PDF签名证书 保障电子发票真实有效
  17. 做到这些让你逃离奴隶的束缚
  18. 如何下载Mbtiles离线地图数据
  19. 使用VB.net将PNG图片转成icon类型图标文件
  20. win10怎么玩经典扫雷?繁星软件园推荐大家试试Windows7Games吧,亲测好用的扫雷Win10电脑版下载!!!

热门文章

  1. 电脑的ppt打不开计算机二级,ppt打不开怎么办?详细教您详细解决方法
  2. 分类学 · 狡兔为何偏要有三窟???
  3. ENVI5.3.1高分2号影像预处理流程
  4. 基于KNN的离群点检测算法的Matlab版实现
  5. 如何区分冲突域和广播域?
  6. 深度残差网络_深度残差收缩网络:借助注意力机制实现特征的软阈值化
  7. SVN和Git优劣对比
  8. 从0到一开发微信小程序(4)—小程序组件
  9. 苹果屏幕镜像_给你们科普一下手机投屏和镜像的区别
  10. Hessian Matrix(海森矩阵)