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

