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线程接收信息相关推荐

  1. 蓝桥杯51单片机之串口通信发送接收信息【单片机开发初学者串口必会】

    文章目录 一.上位机发送信号控制单片机 1.显示对应的流水灯 2.显示对应数码管 3.控制数码管显示的数字 二.两机收发信息 一.上位机发送信号控制单片机 1.显示对应的流水灯 实现现串口通信接收上位 ...

  2. Python3进阶--Socket编程、多线程(创建方式、线程通信、线程锁、线程池)

    第一章 变量.常用循环体.代码结构.代码练习 第二章 列表.元组等数据结构.字符串驻留机制及字符串格式化操作 第三章 函数.面向对象.文件操作.深浅拷贝.模块.异常及捕获 第四章 项目打包.类和对象高 ...

  3. C#专题 | TcpIp通信

    1:C# - TcpIp通信总流程 图1 服务端与服务端关系及各自的流程 2:c# 实现服务端窗体步骤 2.1 :建立并布置窗体如图2所示 图2 窗体样式及控件名 2.2 程序讲解 2.2.1 程序逻 ...

  4. Simulink和MATLAB工作区的TCPIP通信

    Simulink和MATLAB工作区的TCPIP通信 1. 说明 2. 效果展示 3. simulink端的结构和说明 4. 工作区文件说明 5. 文件资源 6. 运行方法 7. 问题 8 多多点赞交 ...

  5. udp 全双工通信 linux,客户端和服务器实现全双工通信(基于线程)

    客户端和服务器实现全双工通信(基于线程) 1. 基于多线程实现一个服务器和一个客户端实现全双工通信 服务器端创建两个线程:一个用于接收客户端发送过来的信息:一个用来给客户端发送信息. 客户端也创建两个 ...

  6. imssage用服务器怎么发信息,iMessage 信息如何安全发送和接收信息

    iMessage 信息如何安全发送和接收信息 用户通过输入一个地址或姓名来开始一次新的 iMessage 对话.如果他们输入一个电话号码或电子邮件地址,设备就会与 Apple 身份识别服务 (IDS) ...

  7. 多线程——线程实现、线程状态、线程同步、线程通信、线程池

    多线程 一.线程 1.普通方法调用和多线程 2.程序.进行.线程 二.线程创建 1.继承Thread类 2.实现Runable接口 3.实现Callable接口 4.静态代理模式 5.Lamda表达式 ...

  8. 线程池如何传递线程上下文信息

     戳蓝字「TopCoder」关注我们哦! 业务开发中,一般都会使用ThreadLocal保存一些上下文信息,但是在线程池中执行对应逻辑时,由于是不同线程所以无法获取之前线程的上下文信息. 线程池的线程 ...

  9. RS232串口通信(UART的接收部分)

    RS232串口通信(UART的接收部分) 置顶 新人博主,创作不易,波形图手绘,请给个点赞关注吧,非常感谢! 串口简介 ​ 串口作为常用的三大低速总线(UART.SPI.IIC)之一,在设计众多通信接 ...

最新文章

  1. intel219网卡的linux驱动,ubuntu16.04安装I219-V网卡驱动问题解决方法(示例代码)
  2. Oracle表连接深入浅出
  3. net Core做一个webApi的简单实例
  4. Python能做的事情很多别的编程语言也能做,python将会是昙花一现吗?看看这位程序员怎么说~
  5. 深入阅读Mina源码(3) —— Mina之IOAdapter(二)
  6. 沈阳自贸区促先进制造业发展 企业可获奖千万元
  7. 自学DevExpress为Form表格换肤
  8. 每日一词20190313——地图矢量化
  9. LTE物理层概述(7)-- LTE之Turbo编码及其matlab仿真1
  10. 遗传算法优化BP神经网络,bp神经网络的优化算法
  11. 计算机连接公用网络受限,电脑连接无线网络受限怎么解决【解决方法】
  12. 怎样让PHP提示错误信息
  13. python文件怎么另存为,python文件怎么保存
  14. mysql创建数据库后出现Access denied for user 'root'@'%' to database ‘xxxx’
  15. 远程协作从“特殊”到“常态”,你可能需要的会议平板测评
  16. Oracle数据库表空间整理回收与释放操作
  17. 湖南工业大学计算机录取分数线,2021湖南工业大学录取分数线_历年各专业分数线(2017-2020),各省投档线_一品高考网...
  18. 栈、队列、数组的区别
  19. 炫‘库’行动-人大金仓有奖征文-挑战国产数据库金仓上k8s(二)
  20. 如何制定客户留存策略_网店如何提升买家留存率

热门文章

  1. 互联网运营打造个人微博之道
  2. managed bean
  3. 透过Q2财报看美团的变与不变
  4. java-word模板转化为pdf
  5. Redis 一定是单线程的进程吗?
  6. 数据仓库详解及分层理论
  7. mac拓展显示屏睡眠或锁屏后启动黑屏,mac typeC不支持4K 60HZ
  8. 男人必看之领带的10种打法(附图)
  9. python程序员推荐笔记本电脑_2020程序员笔记本推荐?
  10. java list定义和初始化_在 Java 中初始化 List 的五种方法