命名空间: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
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















