命名空间:netMarketing.Net.NetSocket.SocketHelper
功能:Tcp/ip通讯辅助类,异步通讯方式,封装了TcpClient,TcpServer
功能详细说明:
Tcp/ip通讯辅助类,异步通讯方式,封装了TcpClient,TcpServer。
常用函数列表:
======服务端========================== /// 初始化服务端对象 监听Any即所有网卡 public override void InitSocket(int port) public override void InitSocket(string ipaddress, int port) /// 启动监听,并处理连接 public override void Start() /// 向所有在线的客户端发送信息. public void SendToAll(string SendData) public void SendToAll(byte[] SendDataBuffer) /// 向某一位客户端发送信息 public void SendToClient(IPEndPoint ip, byte[] SendDataBuffer) public void SendToClient(IPEndPoint ip, string SendData) ///停止服务 public override void Stop() ======客户端========================== /// 初始化Socket public override void InitSocket(string ipaddress, int port) public override void InitSocket(int port) public override void InitSocket(IPAddress ipaddress, int port) /// 重连上端 public void RestartInit() ///发送数据 public void SendData(string SendData) public void SendData(byte[] SendData) /// 重写Start方法,其实就是连接服务端 public override void Start() ///断开连接 public override void Stop()
服务端的参考例子:
先运行程序,点击启动,启动服务端。
然后我们用下面的网络助手工具,连接服务端。
成功连接后,看到网络助手收到连接成功后服务器发来的字符串“www.skcircle.com”。
下面是客户端分别发送字符串“scanReq”,"ccdReq"后,服务端返回的内容。
using netMarketing.Net; using netMarketing.Net.NetSocket; using sharClass; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { private winData configdata = new winData(); private int serverPort = 5000; private int sendBytesCount = 0; private int recvBytesCount = 0; private SocketHelper.TcpServer server = new SocketHelper.TcpServer(); public Form1() { InitializeComponent(); SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec); } private void Rec(SocketHelper.Sockets sks) { this.Invoke(new ThreadStart(delegate { if (sks.ex != null) { //在这里判断ErrorCode 可以自由扩展 switch (sks.ErrorCode) { case SocketHelper.Sockets.ErrorCodes.objectNull: break; case SocketHelper.Sockets.ErrorCodes.ConnectError: break; case SocketHelper.Sockets.ErrorCodes.ConnectSuccess: outmsg("连接成功.!"); break; case SocketHelper.Sockets.ErrorCodes.TrySendData: break; default: break; } recvBytesCount += sks.ex.ToString().Length; outmsg(string.Format("收:{0}字节, 发:{1}字节", recvBytesCount, sendBytesCount)); var msg = string.Format("客户端信息{0}", sks.ex); outmsg(string.Format("客户端信息{0}", msg)); } else { byte[] buffer = new byte[sks.Offset]; recvBytesCount += buffer.Length; outmsg(string.Format("收:{0}字节, 发:{1}字节", recvBytesCount, sendBytesCount)); Array.Copy(sks.RecBuffer, buffer, sks.Offset); string str = Encoding.UTF8.GetString(buffer); if (str == "ServerOff") { outmsg("服务端主动关闭"); } else { outmsg(string.Format("服务端{0}发来消息:{1}", sks.Ip, str)); cmd(sks.Ip,str); outmsg("\r\n"); } } })); } private void cmd(System.Net.IPEndPoint ip, string str) { switch(str) { case "scanReq": server.SendToClient(ip,randomHelper.GenerateRndNumLetter(12)); break; case "ccdReq": server.SendToClient(ip, "+000."+randomHelper.GetRandomInt(1,999)); break; } } private void outmsg(string msg) { if (rtbMsg.InvokeRequired) { rtbMsg.Invoke(new Action(() => { rtbMsg.AppendText(msg); })); } else { rtbMsg.AppendText(msg); } } private void btnStart_Click(object sender, EventArgs e) { int.TryParse(this.tbPort.Text, out this.serverPort); configdata.laserPort = this.serverPort; workInfoToDisk(); server.InitSocket(this.serverPort); server.Start(); } private void Form1_Load(object sender, EventArgs e) { if (workInfoFromDisk()) { this.tbPort.Text = configdata.laserPort.ToString(); } } public bool workInfoFromDisk() { try { var res = Serialize.FileDeSerialize(AppDomain.CurrentDomain.BaseDirectory + "autoCaliSetting"); if (null != res) { configdata = res as winData; return true; } return false; } catch (Exception ex) { return false; } } public bool workInfoToDisk() { try { Serialize.FileSerialize(AppDomain.CurrentDomain.BaseDirectory + "autoCaliSetting", configdata); return true; } catch (Exception ex) { throw new ArgumentException(ex.Message); } } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { server.Stop(); } } [Serializable] public class winData { public int laserChannel { get; set; } public int dataSum { get; set; } public string laserIP { get; set; } public int laserPort { get; set; } } }
客户端的参考例子:
用网络助手创建一个tcp server,然后测试下面的程序。
using netMarketing.ConvertAbout; using netMarketing.Net; using netMarketing.winformHelper; using sharClass; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace netMarketing.dialog { public partial class tcpClientDlg : myForm { private string[] msgAry = new string[] { "", "", "", "", "" }; private SocketHelper.TcpClients tcpClient = new SocketHelper.TcpClients(); private string curDlgName = string.Empty; private string serverIp = string.Empty; private int serverPort = 0; private int sendBytesCount = 0; private int recvBytesCount = 0; private bool sendOkFlag = false; public tcpClientDlg(string dlgName) { InitializeComponent(); this.curDlgName = this.myFormName = dlgName; msgAry[0] = "已断开"; msgAry[1] = "对方IP:"; msgAry[2] = "对方端口:"; msgAry[3] = "本地端口:"; msgAry[4] = "收:0字节, 发:0字节"; SocketHelper.pushSockets = new SocketHelper.PushSockets(Rec);//注册推送器 this.Icon = Resource1.Allegro; } /// <summary> /// 处理推送过来的消息 /// </summary> /// <param name="rec"></param> private void Rec(SocketHelper.Sockets sks) { this.Invoke(new ThreadStart(delegate { if (rtbRecv.Text.Length > 1000) { rtbRecv.Text = ""; } if (sks.ex != null) { //在这里判断ErrorCode 可以自由扩展 switch (sks.ErrorCode) { case SocketHelper.Sockets.ErrorCodes.objectNull: break; case SocketHelper.Sockets.ErrorCodes.ConnectError: break; case SocketHelper.Sockets.ErrorCodes.ConnectSuccess: rtbRecv.AppendText("连接成功.!"); break; case SocketHelper.Sockets.ErrorCodes.TrySendData: break; default: break; } recvBytesCount += sks.ex.ToString().Length; msgAry[4] = string.Format("收:{0}字节, 发:{1}字节", recvBytesCount, sendBytesCount); var msg = string.Format("客户端信息{0}", sks.ex); rtbRecv.AppendText(string.Format("客户端信息{0}", msg)); } else { byte[] buffer = new byte[sks.Offset]; recvBytesCount += buffer.Length; msgAry[4] = string.Format("收:{0}字节, 发:{1}字节", recvBytesCount, sendBytesCount); Array.Copy(sks.RecBuffer, buffer, sks.Offset); string str = Encoding.UTF8.GetString(buffer); if (str == "ServerOff") { rtbRecv.AppendText("服务端主动关闭"); } else { if (chkHexMode.Checked) { var sb = new StringBuilder(); sb.Append("{ "); foreach (var m in buffer) { sb.Append(ConvertHelper.ConvertBase(m, 10, 16)); sb.Append(" "); } str = sb.ToString() + "}"; } rtbRecv.AppendText(string.Format("服务端{0}发来消息:{1}", sks.Ip, str)); rtbRecv.AppendText("\r\n"); } } })); } private void tcpClientDlg_Load(object sender, EventArgs e) { this.Text = this.curDlgName; timer1.Start(); } private void btnCreate_Click(object sender, EventArgs e) { var dlg = new createTcpClientDlg(); dlg.StartPosition = FormStartPosition.CenterParent; var res = dlg.ShowDialog(); if (res == DialogResult.OK) { try { this.serverIp = dlg.ServerIP; this.serverPort = dlg.ServerPORT; } catch (Exception ex) { MessageBox.Show(ex.Message); } } } private void timer1_Tick(object sender, EventArgs e) { if (sendOkFlag) { sendOkFlag = false; rtbSend.Text = ""; } lab1.Text = msgAry[0]; lab2.Text = msgAry[1]; lab3.Text = msgAry[2]; lab4.Text = msgAry[3]; lab5.Text = msgAry[4]; if (this.serverIp.Length < 5) { btnCreate.Enabled = true; btnConnect.Enabled = false; btnUnConnect.Enabled = false; } else { btnCreate.Enabled = false; if (tcpClient.client != null && tcpClient.client.Connected) { btnConnect.Enabled = false; btnUnConnect.Enabled = true; } else { btnConnect.Enabled = true; btnUnConnect.Enabled = false; } } } private void btnConnect_Click(object sender, EventArgs e) { tcpClient.InitSocket(this.serverIp, this.serverPort); tcpClient.Start(); msgAry[0] = "已连接"; msgAry[1] = string.Format("对方IP:{0}", this.serverIp); msgAry[2] = string.Format("对方端口:{0}", this.serverPort); } private void btnUnConnect_Click(object sender, EventArgs e) { tcpClient.Stop(); msgAry[0] = "已断开"; msgAry[1] = string.Format("对方IP:{0}", ""); msgAry[2] = string.Format("对方端口:{0}", ""); } private void btnSend_Click(object sender, EventArgs e) { string msg = rtbSend.Text; sendOkFlag = false; if (chkHexMode.Checked) msg = ConvertHelper.rs232Convert.HexStringToString(msg, Encoding.ASCII); sendBytesCount += msg.Length; var num = ConvertHelper.ToXXX.ToInt(cbxRpeatCount.Text); ThreadPool.QueueUserWorkItem(s => { for (int i = 0; i < num; i++) { tcpClient.SendData(msg); if (i > 0) ShowAlarm.Delay(1000); msgAry[4] = string.Format("收:{0}字节, 发:{1}字节", recvBytesCount, sendBytesCount); sendOkFlag = true; } }); } private void btnClearDataRecv_Click(object sender, EventArgs e) { rtbRecv.Text = ""; } private void btnTJClearZero_Click(object sender, EventArgs e) { sendBytesCount = recvBytesCount = 0; } private void chkHexMode_CheckedChanged(object sender, EventArgs e) { var obj = (sender as CheckBox); if (rtbSend.Text.Length > 0) { if (obj.Checked) { rtbSend.Text = ConvertHelper.rs232Convert.StringToHexString(rtbSend.Text, Encoding.ASCII); } else { rtbSend.Text = ConvertHelper.rs232Convert.HexStringToString(rtbSend.Text, Encoding.ASCII); } } } private void tcpClientDlg_FormClosed(object sender, FormClosedEventArgs e) { tcpClient.Stop(); } } }
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

