c# tcpip 通信 Task线程接收信息
1 c# tcpip通信-用线程实现数据接收与发送
针对用定时器实现数据接收过程出现的界面卡死现象,本次采用线程进行数据接收过程。服务端和客户端如图1所示。
图1 服务端和客户端
2 程序讲解
c# 实现服务端程序
using System;
using System.Text;
using System.Windows.Forms;
//与TCP-IP相关的命名空间
using System.Net;
using System.Net.Sockets;
//与线程相关的命名空间
using System.Threading;
using System.Threading.Tasks;namespace C_Sharp_TCPIP_Connect_text
{public partial class Frm_Serviers : Form{public Frm_Serviers(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}EndPoint endpoint;//建立一个Endpoint类型变量private CancellationTokenSource cts1;//建立一个线程管理变量,该值默认为falsebyte[] received_data = new byte[1024];//创建一个缓存区#region C#实现Tcp_Ip通信-服务端Socket acceptted_Socket;//创建一个Socket变量,用来存放服务端所连接的客户端的Socket//第一步Socket:1.1-创建服务端Socket套接字Socket server;//该套接字在全局中创建,在要连接时给初始化/// <summary>/// 服务端启动TCP-IP连接功能/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_TcpIp_Connect_Click(object sender, EventArgs e){ try{//1.2-对所创建服务端Socket套接字初始化server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//第二步Bind:2.1-创建Endoint变量,//通过获取IP地址和端口为其初始化。为调用server变量下Bind方法提供参数endpoint = new IPEndPoint(IPAddress.Parse(txt_IP.Text.Trim()), int.Parse(txt_Port.Text.Trim()));//获取IP与端口//2.2-服务端调用Bind方法,执行绑定server.Bind(endpoint);//第三步Listen:3.1-调用server变量下Listen方法server.Listen(10);//参数是监听客户的的个数。如有11各客户的连接到服务端,那么只有前10各能连接上//第四步Accept:4.1-调用server变量下Accept方法,该方法会返回一个Socet对象,表明和哪一个客户端建立了acceptted_Socket = server.Accept();//等到客户端连接,当连接上时,返回所连接的客户端的Socket套接字#region 接下来就是实现服务端接收信息和发送信息功能/*可根据自己需求,在想发送的地方发送数据,在想接收信息的地方接收数据*通常在建立连接时就接收数据,并发送一个连接成功的数据*/acceptted_Socket.Send(Encoding.UTF8.GetBytes("你好" + acceptted_Socket.ToString() + ",你已成功连接到服务器\n"));//向所连接的客户端发送一个连接成功消息 #region 开启数据接收线程cts1 = new CancellationTokenSource();//实例化Task.Factory.StartNew(Message_receive, cts1.Token);//开启线程cts1,该线程执行的方法是Message_receive#endregion#endregion}catch (Exception ex){MessageBox.Show("错误提示:" + ex.Message);} }/// <summary>/// 线程指定的方法/// </summary>private void Message_receive(){while (!cts1.IsCancellationRequested)//当cts1的值IsCancellationRequested为false时{try{//调用Receive方法接收客户端信息,该方法返回一个int值表示所接收到的字节数。int num = acceptted_Socket.Receive(received_data);//将所接收的客户端信息放到缓存区,并返回接收的字节数量if (string.IsNullOrEmpty(num.ToString())){Console.WriteLine("无数据");}else{rtb_ReceicedData.Text += Encoding.UTF8.GetString(received_data, 0, num);//将接收到的数据显示在桌面上}Thread.Sleep(1000);}catch(Exception ex){MessageBox.Show("错误提示:" + ex.Message);break;} }}#endregion/// <summary>/// 断开连接/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_Tcpip_DisConnect_Click(object sender, EventArgs e){acceptted_Socket.Close();cts1.Cancel();//将cts1的值IsCancellationRequested改为true}private void btn_send_Click(object sender, EventArgs e){acceptted_Socket.Send(Encoding.UTF8.GetBytes(rtb_sendtoclient.Text));//向所连接的客户端发送一个连接成功消息 }private void btn_clear_Click(object sender, EventArgs e){rtb_ReceicedData.Text = "";}private void btn_clear_sendmessage_Click(object sender, EventArgs e){rtb_sendtoclient.Text = "";}}
}
c# 实现客户端程序
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Windows.Forms;
//与线程相关的命名空间
using System.Threading;
using System.Threading.Tasks;namespace C_Sharp_TCPIP_client_text
{public partial class Frm_Client : Form{public Frm_Client(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;}byte[] received_data = new byte[1024];//创建一个缓存区 private CancellationTokenSource cts1;//建立一个线程管理变量,该值默认为false#region c#实现tcpip客户端功能//第一步Socket:1.1-创建客户端Socket套接字Socket client;//客户端的Socket变量/// <summary>/// 在连接按钮中实现客户端连接到指定的服务器:实现客户端的connect/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void btn_TcpIp_Connect_Click(object sender, EventArgs e){try{//1.2-对所创建客户端Socket套接字初始化client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//第二步Connect:2.1-创建Endoint变量,//通过获取IP地址和端口为其初始化。为调用client变量下Connect方法提供参数EndPoint endpoint = new IPEndPoint(IPAddress.Parse(txt_IP.Text.Trim()), int.Parse(txt_Port.Text.Trim()));//获取IP与端口//2.2-客户端调用client变量下Connect方法,该方法无返回值client.Connect(endpoint);#region 接下来就是实现服务端接收信息和发送信息功能/*可根据自己需求,在想发送的地方发送数据,在想接收信息的地方接收数据*通常在建立连接时就接收一个数据以表示连接成功,并向服务器发送一个连接成功的数据*/client.Send(Encoding.UTF8.GetBytes("你好,服务器" + txt_IP.Text.Trim() + ",我已成功向你建立起连接\n"));//开启接收服务器发送的信息定时器#region 开启数据接收线程cts1 = new CancellationTokenSource();Task.Factory.StartNew(Message_receive, cts1.Token);//开启线程cts1,该线程执行的方法是Message_receive#endregion#endregion}catch (Exception ex){MessageBox.Show("错误提示:" + ex.Message);}}#endregionprivate void Message_receive(){while (!cts1.IsCancellationRequested)//当cts1的值IsCancellationRequested为false时{try{//调用Receive方法接收服务端信息,该方法返回一个int值表示所接收到的字节数。int num = client.Receive(received_data);//将所接收的服务端信息放到缓存区,并返回接收的字节数量if (string.IsNullOrEmpty(num.ToString())){Console.WriteLine("无数据");}else{rtb_serviceData.Text += Encoding.UTF8.GetString(received_data, 0, num);//将接收到的数据显示在桌面上 }Thread.Sleep(1000);}catch (Exception ex){MessageBox.Show("错误提示:" + ex.Message);break;}}} private void btn_Tcpip_DisConnect_Click(object sender, EventArgs e){client.Close();cts1.Cancel();//将cts1的值IsCancellationRequested改为true}private void btn_clear_servicedata_rtb_Click(object sender, EventArgs e){rtb_serviceData.Text = "";}private void btn_clear_sendingdata_rtb_Click(object sender, EventArgs e){rtb_sendingData.Text = "";}private void btn_sendData_Click(object sender, EventArgs e){client.Send(Encoding.UTF8.GetBytes(rtb_sendingData.Text));}}
}
3 结果
4 关键点
4.1 对于引用Tasks命名空间错误
using System.Threading.Tasks;
会出现未引入程序集错误
该错误是由于.NET框架版本太低导致。可更改该项目的.NET框架,操作步骤如下:
(1)点击"解决方案"下的项目名,右键,选择 属性
(2)更改 目标框架 ,选择新的.NET框架,即可解决问题
4.2 基于Task建立的线程
4.2.1 程序流程
图2 基于Tasks建立实现线程流程
4.2.2 Task实现线程功能,可参考博客
https://blog.csdn.net/chenweicode/article/details/90904438
5 实例资源
5.1 通过定时器实现的数据接收(界面会卡死)
https://download.csdn.net/download/asd_8_8_8_8_8_8_asd/16338898
5.2 通过线程实现的数据接收(界面正常)
https://download.csdn.net/download/asd_8_8_8_8_8_8_asd/16523706
5.3 文档说明与实例
https://download.csdn.net/download/asd_8_8_8_8_8_8_asd/16523608
c# tcpip 通信 Task线程接收信息相关推荐
- 蓝桥杯51单片机之串口通信发送接收信息【单片机开发初学者串口必会】
文章目录 一.上位机发送信号控制单片机 1.显示对应的流水灯 2.显示对应数码管 3.控制数码管显示的数字 二.两机收发信息 一.上位机发送信号控制单片机 1.显示对应的流水灯 实现现串口通信接收上位 ...
- Python3进阶--Socket编程、多线程(创建方式、线程通信、线程锁、线程池)
第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...
- C#专题 | TcpIp通信
1:C# - TcpIp通信总流程 图1 服务端与服务端关系及各自的流程 2:c# 实现服务端窗体步骤 2.1 :建立并布置窗体如图2所示 图2 窗体样式及控件名 2.2 程序讲解 2.2.1 程序逻 ...
- Simulink和MATLAB工作区的TCPIP通信
Simulink和MATLAB工作区的TCPIP通信 1. 说明 2. 效果展示 3. simulink端的结构和说明 4. 工作区文件说明 5. 文件资源 6. 运行方法 7. 问题 8 多多点赞交 ...
- udp 全双工通信 linux,客户端和服务器实现全双工通信(基于线程)
客户端和服务器实现全双工通信(基于线程) 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客户端发送过来的信息:一个用来给客户端发送信息. 客户端也创建两个 ...
- imssage用服务器怎么发信息,iMessage 信息如何安全发送和接收信息
iMessage 信息如何安全发送和接收信息 用户通过输入一个地址或姓名来开始一次新的 iMessage 对话.如果他们输入一个电话号码或电子邮件地址,设备就会与 Apple 身份识别服务 (IDS) ...
- 多线程——线程实现、线程状态、线程同步、线程通信、线程池
多线程 一.线程 1.普通方法调用和多线程 2.程序.进行.线程 二.线程创建 1.继承Thread类 2.实现Runable接口 3.实现Callable接口 4.静态代理模式 5.Lamda表达式 ...
- 线程池如何传递线程上下文信息
戳蓝字「TopCoder」关注我们哦! 业务开发中,一般都会使用ThreadLocal保存一些上下文信息,但是在线程池中执行对应逻辑时,由于是不同线程所以无法获取之前线程的上下文信息. 线程池的线程 ...
- RS232串口通信(UART的接收部分)
RS232串口通信(UART的接收部分) 置顶 新人博主,创作不易,波形图手绘,请给个点赞关注吧,非常感谢! 串口简介 串口作为常用的三大低速总线(UART.SPI.IIC)之一,在设计众多通信接 ...
最新文章
- intel219网卡的linux驱动,ubuntu16.04安装I219-V网卡驱动问题解决方法(示例代码)
- Oracle表连接深入浅出
- net Core做一个webApi的简单实例
- Python能做的事情很多别的编程语言也能做,python将会是昙花一现吗?看看这位程序员怎么说~
- 深入阅读Mina源码(3) —— Mina之IOAdapter(二)
- 沈阳自贸区促先进制造业发展 企业可获奖千万元
- 自学DevExpress为Form表格换肤
- 每日一词20190313——地图矢量化
- LTE物理层概述(7)-- LTE之Turbo编码及其matlab仿真1
- 遗传算法优化BP神经网络,bp神经网络的优化算法
- 计算机连接公用网络受限,电脑连接无线网络受限怎么解决【解决方法】
- 怎样让PHP提示错误信息
- python文件怎么另存为,python文件怎么保存
- mysql创建数据库后出现Access denied for user 'root'@'%' to database ‘xxxx’
- 远程协作从“特殊”到“常态”,你可能需要的会议平板测评
- Oracle数据库表空间整理回收与释放操作
- 湖南工业大学计算机录取分数线,2021湖南工业大学录取分数线_历年各专业分数线(2017-2020),各省投档线_一品高考网...
- 栈、队列、数组的区别
- 炫‘库’行动-人大金仓有奖征文-挑战国产数据库金仓上k8s(二)
- 如何制定客户留存策略_网店如何提升买家留存率