[netMarketing类库] SocketHelper类:异步读写的Tcp客户端与服务端类

命名空间: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()



服务端的参考例子:


先运行程序,点击启动,启动服务端。

image.png

然后我们用下面的网络助手工具,连接服务端。

image.png

成功连接后,看到网络助手收到连接成功后服务器发来的字符串“www.skcircle.com”。

image.png

下面是客户端分别发送字符串“scanReq”,"ccdReq"后,服务端返回的内容。

image.png

image.png


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,然后测试下面的程序。

image.png


image.png


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

返回类库功能说明目录




本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864