命名空间:netMarketing.Net.SocketComm.ReaderMethod
功能:基于socket的 TcpClient,TcpServer
功能详细说明:
封装了TcpClient,TcpServer。
这个类使用简单好用,SocketHelper的Server端有时候会报异常,由于勇哥没有精力排除该问题,因此凡是要使用Tcp Server的,推荐使用本类。
2019/8/3 勇哥注:
后来发现这个类的ReceiveCallback有问题,机器人使用socket client方式发指令过来后,第一次可以收到,之后再发一次就收不到。
但是奇怪的是,使用socket工具不间断的发,却没有发现这种问题。
因此,在这个问题没有修正之前,请不要使用这个类创建tcp server!
常用函数列表:
///数据接收回调
public ReciveDataCallback ReceiveCallback;
///数据发送回调
public SendDataCallback SendCallback;
///异步回调
public AnalyDataCallback AnalyCallback;
///构造函数
public ReaderMethod()
///创建客户端,连接服务器
public int ConnectServer(IPAddress ipAddress, int nPort, out string strException)
///创建服务器
public void OpenServer(int portNum)
///回发消息,无论是tcp客户端或者服务端都使用这个函数回发消息
public bool ServerSendMessage(byte[] by)
服务端的参考例子:
using netMarketing.Net.SocketComm;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
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;
ReaderMethod server = new ReaderMethod();
public Form1()
{
InitializeComponent();
//回调函数
server.ReceiveCallback = ReceiveDataCamera;
}
private void ReceiveDataCamera(byte[] btAryReceiveData)
{
string str = System.Text.Encoding.Default.GetString(btAryReceiveData);//数据接收转string
outmsg("接收到数据:" + str);
}
//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)
{
string pos = "";
switch(str.ToLower())
{
case "scanreq":
var sn = "abcdefg";
server.ServerSendMessage(Encoding.Default.GetBytes(sn));
outmsg(sn+Environment.NewLine);
break;
case "1go":
pos = "369.090,-329.904,359.417,129,990";
server.ServerSendMessage(Encoding.Default.GetBytes(pos));
outmsg(Environment.NewLine+pos + Environment.NewLine);
break;
case "go2":
pos = "269.909,20.096,359.417,129.990";
server.ServerSendMessage(Encoding.Default.GetBytes(pos));
outmsg(Environment.NewLine + pos + Environment.NewLine);
break;
case "go3":
pos = "369.909,120.095,359.417,129.990";
server.ServerSendMessage(Encoding.Default.GetBytes(pos));
outmsg(Environment.NewLine + pos + Environment.NewLine);
break;
case "go4":
pos = "219.909,420.096,359.418,129.990";
server.ServerSendMessage(Encoding.Default.GetBytes(pos));
outmsg(Environment.NewLine + pos + Environment.NewLine);
break;
case "go5":
pos = "269.919,-329.895,359.425,129.996";
server.ServerSendMessage(Encoding.Default.GetBytes(pos));
outmsg(Environment.NewLine + pos + Environment.NewLine);
break;
case "go6":
pos = "69.909,420.096,359.417,129.990";
server.ServerSendMessage(Encoding.Default.GetBytes(pos));
outmsg(Environment.NewLine + pos + Environment.NewLine);
break;
default:
server.ServerSendMessage(Encoding.Default.GetBytes("error A1"));
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();
int nPort = configdata.laserPort;
server.OpenServer(nPort);
MessageBox.Show("OK");
}
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)
{
}
}
[Serializable]
public class winData
{
public int laserChannel { get; set; }
public int dataSum { get; set; }
public string laserIP { get; set; }
public int laserPort { get; set; }
}
}
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

