担保公司网站建设方案,WordPress 多厂商,学校网站建设的流程,素材网站有哪些文章目录 1️⃣ 通信相关说明1.1服务端与客户端1.2 信息发送原理1.3 信息接收原理 2️⃣ socket代码2.1 客户端代码2.2 服务端代码 3️⃣ 定时任务处理报文3.1 Timers定时任务 优质资源分享 作者#xff1a;xcLeigh 文章地址#xff1a;https://blog.csdn.net/weixin_4315141… 文章目录 1️⃣ 通信相关说明1.1服务端与客户端1.2 信息发送原理1.3 信息接收原理 2️⃣ socket代码2.1 客户端代码2.2 服务端代码 3️⃣ 定时任务处理报文3.1 Timers定时任务 优质资源分享 作者xcLeigh 文章地址https://blog.csdn.net/weixin_43151418/article/details/136257608 C# winfroms使用socket客户端服务端代码详解声明Socket 第一个参数寻址方式第二个参数传输数据的方式第三个参数通信协议Socket socket new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 开启侦听 参数是指可以连接的客户端数量socket.Listen(10);socket.Accept();这里需要注意Accept()会阻塞线程直到连接上客户端。如果放在主线程中会阻塞前台操作。需要创建一个新的线程。Accept()返回一个socket客户端连接上之后服务端自动生成一个socket和连接的客端通信。连接成功后向客户端发送“连接成功” 1️⃣ 通信相关说明
1.1服务端与客户端 启动服务端后,服务端通过持续监听客户端发来的请求,一旦监听到客户端传来的信息请求,两端便可以互发信息了. 服务端需要绑定一个IP,用于客户端在网络中寻找并建立连接支持局域网内部客户端与服务端之间的互相通信
1.2 信息发送原理 将手动输入字符串信息转换成机器可以识别的字节数组,然后调用套接字的Send()方法将字节数组发送出去
1.3 信息接收原理 调用套接字的Receive()方法,获取对端传来的字节数组,然后将其转换成人可以读懂的字符串信息
2️⃣ socket代码
2.1 客户端代码
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.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace TcpMsgClient
{public partial class FrmClient : Form{public FrmClient(){InitializeComponent();//关闭对文本框的非法线程操作检查TextBox.CheckForIllegalCrossThreadCalls false;}//创建 1个客户端套接字 和1个负责监听服务端请求的线程Socket socketClient null;Thread threadClient null;/// summary/// 连接服务端事件/// /summary/// param namesender/param/// param namee/paramprivate void btnListenServer_Click(object sender, EventArgs e){//定义一个套字节监听 包含3个参数(IP4寻址协议,流式连接,TCP协议)socketClient new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//需要获取文本框中的IP地址IPAddress ipaddress IPAddress.Parse(this.txtIP.Text.Trim());//将获取的ip地址和端口号绑定到网络节点endpoint上IPEndPoint endpoint new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim()));//这里客户端套接字连接到网络节点(服务端)用的方法是Connect 而不是Bindtry{socketClient.Connect(endpoint);this.txtMsg.AppendText(客户端连接服务端成功 \r\n);this.btnListenServer.Enabled false;//创建一个线程 用于监听服务端发来的消息threadClient new Thread(RecMsg);//将窗体线程设置为与后台同步threadClient.IsBackground true;//启动线程threadClient.Start();}catch (Exception ex) {this.txtMsg.AppendText(远程服务端断开连接失败 \r\n);}}/// summary/// 接收服务端发来信息的方法/// /summaryprivate void RecMsg(){while (true) //持续监听服务端发来的消息{try{//定义一个1M的内存缓冲区 用于临时性存储接收到的信息byte[] arrRecMsg new byte[1024 * 1024];//将客户端套接字接收到的数据存入内存缓冲区, 并获取其长度int length socketClient.Receive(arrRecMsg);//将套接字获取到的字节数组转换为人可以看懂的字符串string strRecMsg Encoding.UTF8.GetString(arrRecMsg, 0, length);//将发送的信息追加到聊天内容文本框中txtMsg.AppendText(服务端 GetCurrentTime() \r\n strRecMsg \r\n);}catch (Exception ex) {this.txtMsg.AppendText(远程服务器已中断连接\r\n);this.btnListenServer.Enabled true;break;}}}/// summary/// 发送字符串信息到服务端的方法/// /summary/// param namesendMsg发送的字符串信息/paramprivate void ClientSendMsg(string sendMsg){try {//将输入的内容字符串转换为机器可以识别的字节数组byte[] arrClientSendMsg Encoding.UTF8.GetBytes(sendMsg);//调用客户端套接字发送字节数组socketClient.Send(arrClientSendMsg);//将发送的信息追加到聊天内容文本框中txtMsg.AppendText(天涯 GetCurrentTime() \r\n sendMsg \r\n);}catch(Exception ex){this.txtMsg.AppendText(远程服务器已中断连接,无法发送消息 \r\n);}}private void btnSendMsg_Click(object sender, EventArgs e){//调用ClientSendMsg方法 将文本框中输入的信息发送给服务端ClientSendMsg(this.txtClientSendMsg.Text.Trim());this.txtClientSendMsg.Clear();}private void txtClientSendMsg_KeyDown(object sender, KeyEventArgs e){//当光标位于文本框时 如果用户按下了键盘上的Enter键if (e.KeyCode Keys.Enter){//则调用客户端向服务端发送信息的方法ClientSendMsg(this.txtClientSendMsg.Text.Trim());this.txtClientSendMsg.Clear();}}/// summary/// 获取当前系统时间的方法/// /summary/// returns当前时间/returnsprivate DateTime GetCurrentTime(){DateTime currentTime new DateTime();currentTime DateTime.Now;return currentTime;}}
}2.2 服务端代码
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.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace TcpMsgServer
{public partial class FrmServer : Form{public FrmServer(){InitializeComponent();//关闭对文本框的非法线程操作检查TextBox.CheckForIllegalCrossThreadCalls false;}Thread threadWatch null; //负责监听客户端的线程Socket socketWatch null; //负责监听客户端的套接字/// summary/// 启动服务/// /summary/// param namesender/param/// param namee/paramprivate void btnServerConn_Click(object sender, EventArgs e){try{//定义一个套接字用于监听客户端发来的信息 包含3个参数(IP4寻址协议,流式连接,TCP协议)socketWatch new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//服务端发送信息 需要1个IP地址和端口号IPAddress ipaddress IPAddress.Parse(this.txtIP.Text.Trim()); //获取文本框输入的IP地址//将IP地址和端口号绑定到网络节点endpoint上IPEndPoint endpoint new IPEndPoint(ipaddress, int.Parse(this.txtPort.Text.Trim())); //获取文本框上输入的端口号//监听绑定的网络节点socketWatch.Bind(endpoint);//将套接字的监听队列长度限制为20socketWatch.Listen(20);//创建一个监听线程threadWatch new Thread(WatchConnecting);//将窗体线程设置为与后台同步threadWatch.IsBackground true;//启动线程threadWatch.Start();//启动线程后 txtMsg文本框显示相应提示txtMsg.AppendText(开始监听客户端传来的信息! \r\n);this.btnServerConn.Enabled false;}catch (Exception ex) {txtMsg.AppendText(服务端启动服务失败! \r\n);this.btnServerConn.Enabled true;}}//创建一个负责和客户端通信的套接字Socket socConnection null;/// summary/// 监听客户端发来的请求/// /summaryprivate void WatchConnecting(){while (true) //持续不断监听客户端发来的请求{socConnection socketWatch.Accept();txtMsg.AppendText(客户端连接成功! \r\n);//创建一个通信线程ParameterizedThreadStart pts new ParameterizedThreadStart(ServerRecMsg);Thread thr new Thread(pts);thr.IsBackground true;//启动线程thr.Start(socConnection);}}/// summary/// 发送信息到客户端的方法/// /summary/// param namesendMsg发送的字符串信息/paramprivate void ServerSendMsg(string sendMsg){try{//将输入的字符串转换成 机器可以识别的字节数组byte[] arrSendMsg Encoding.UTF8.GetBytes(sendMsg);//向客户端发送字节数组信息socConnection.Send(arrSendMsg);//将发送的字符串信息附加到文本框txtMsg上txtMsg.AppendText(服务器 GetCurrentTime() \r\n sendMsg \r\n);}catch (Exception ex) {txtMsg.AppendText(客户端已断开连接,无法发送信息 \r\n);}}/// summary/// 接收客户端发来的信息/// /summary/// param namesocketClientPara客户端套接字对象/paramprivate void ServerRecMsg(object socketClientPara){Socket socketServer socketClientPara as Socket;while (true){//创建一个内存缓冲区 其大小为1024*1024字节 即1Mbyte[] arrServerRecMsg new byte[1024 * 1024];try{//将接收到的信息存入到内存缓冲区,并返回其字节数组的长度int length socketServer.Receive(arrServerRecMsg);//将机器接受到的字节数组转换为人可以读懂的字符串string strSRecMsg Encoding.UTF8.GetString(arrServerRecMsg, 0, length);//将发送的字符串信息附加到文本框txtMsg上txtMsg.AppendText(天涯 GetCurrentTime() \r\n strSRecMsg \r\n);}catch (Exception ex) {txtMsg.AppendText(客户端已断开连接 \r\n);break;}}}/// summary/// 发送消息到客户端/// /summary/// param namesender/param/// param namee/paramprivate void btnSendMsg_Click(object sender, EventArgs e){//调用 ServerSendMsg方法 发送信息到客户端ServerSendMsg(this.txtSendMsg.Text.Trim());this.txtSendMsg.Clear();}/// summary/// 快捷键 Enter 发送信息/// /summary/// param namesender/param/// param namee/paramprivate void txtSendMsg_KeyDown(object sender, KeyEventArgs e){//如果用户按下了Enter键if (e.KeyCode Keys.Enter){//则调用 服务器向客户端发送信息的方法ServerSendMsg(txtSendMsg.Text.Trim());this.txtSendMsg.Clear();}}/// summary/// 获取当前系统时间的方法/// /summary/// returns当前时间/returnsprivate DateTime GetCurrentTime(){DateTime currentTime new DateTime();currentTime DateTime.Now;return currentTime;}/// summary/// 获取本地IPv4地址/// /summary/// returns/returnspublic IPAddress GetLocalIPv4Address() {IPAddress localIpv4 null;//获取本机所有的IP地址列表IPAddress[] IpList Dns.GetHostAddresses(Dns.GetHostName());//循环遍历所有IP地址foreach (IPAddress IP in IpList) {//判断是否是IPv4地址if (IP.AddressFamily AddressFamily.InterNetwork){localIpv4 IP;}else {continue;}}return localIpv4;}/// summary/// 获取本地IP事件/// /summary/// param namesender/param/// param namee/paramprivate void btnGetLocalIP_Click(object sender, EventArgs e){//接收IPv4的地址IPAddress localIP GetLocalIPv4Address();//赋值给文本框this.txtIP.Text localIP.ToString();}}
}
3️⃣ 定时任务处理报文
3.1 Timers定时任务 在内部多线程情况下这个定时任务支持启动设定条件满足后执行任务不满做执行设定任务然后自动销毁。
using SimulateMaster.Bean;
using SimulateMaster.page;
using Sunny.UI;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;namespace SimulateMaster.Util
{public class MsgReply{private ServiceMain _serviceMain;private readonly System.Timers.Timer _timer;public static string clicentInfo_value ; //设备信息【IP端口】public static string mainName_value; //窗体名称public static string msgContent MsgUtils.MSG_QDLL;//报文内容public int msgNum0;//重发次数 最多三次public MsgReply(string msgValue,string clientInfo,string mainName, ServiceMain serviceMain){clicentInfo_value clientInfo;mainName_value mainName;_serviceMain serviceMain;msgContent msgValue;// 设置定时器间隔单位为毫秒_timer new System.Timers.Timer(5000);// 添加 Elapsed 事件处理程序_timer.Elapsed OnTimerElapsed;// 开始计时器_timer.Start();}protected virtual void OnTimerElapsed(object sender, ElapsedEventArgs e){FileUtils.WriteFileLog(定时任务触发没有接收到回复报文!, 报文接收定时任务);}public void Dispose(){FileUtils.WriteFileLog(clicentInfo_value 定时任务关闭!, 报文接收定时任务);if (_timer ! null _timer.Enabled)_timer.Stop();_timer?.Dispose();}}
} --------------- 业精于勤荒于嬉 --------------- --------------- 行成于思毁于随 --------------- 优质资源分享
【总览】程序员前端、后端资源合集
【源码】程序员优质资源汇总
【博主推荐】JAVA SSM框架的后台管理系统附源码
【博主推荐】SpringBoot API接口对数据库增删改查,路由,TOKEN,WebSocket完整版(附源码)
【博主推荐】HTML制作一个美观的个人简介网页附源码
【博主推荐】html好看的个人简历网页版(附源码)
【博主推荐】html好看的个人主页(附源码)
【博主推荐】html好看的邀请函(附源码)
【博主推荐】html好看的音乐播放器(附源码)
【博主推荐】html好看的拼图小游戏(附源码)
【博主推荐】html好看的拼图验证码(附源码)
【博主推荐】html界面绘制SVG图形(附源码)
【博主推荐】html操作SVG图(附源码)
【博主推荐】html下拉框树形附好看的登录界面
【博主推荐】HTML5响应式手机WEB(附源码)
【博主推荐】大数据可视化大屏(源码下载)
【博主推荐】html引用百度地图定位闪烁弹框树形(附源码)
【博主推荐】HTML酷炫动画表白求爱界面(附源码) 关注博主 带你实现畅游前后端 加入社区 带你体验马航不孤单 神秘个人简介 带你体验不一样得介绍 酷炫邀请函 带你体验高大上得邀请 ① 提供云服务部署有自己的阿里云 ② 提供前端、后端、应用程序、H5、小程序、公众号等相关业务 如合作请联系我期待您的联系。 注本文撰写于CSDN平台,作者xcLeigh所有权归作者所有 https://blog.csdn.net/weixin_43151418如果相关下载没有跳转请查看这个地址相关链接没有跳转皆是抄袭本文转载请备注本文原地址。 亲码字不易动动小手欢迎 点赞 ➕ 收藏如 问题请留言评论博主看见后一定及时给您答复 原文地址https://blog.csdn.net/weixin_43151418/article/details/136257608防止抄袭原文地址不可删除