C#的TCP/IP探索


  读了好多篇文章,也没有将C#的TCP/IP通信写出来,这里线写过程,日后全部完成后再做进一步整理。

  首先,去了解Socket,找到一篇Socket描述比较细致的文章:https://www.cnblogs.com/BLoodMaster/archive/2010/07/02/1769774.html

  这里,我们的目标并不是通过自己写一对服务器和客户端程序来测试TCP/IP消息的互通,而是通过SSCOM软件,来分别对实现的程序进行测试。

 首先,添加一下命名空间引用

using System.Threading;
using System.Net;
using System.Net.Sockets;
using System.IO;

 添加窗体控件

由于异步通信需要使用线程,在线程中无法直接对控件赋值,因此使用委托的方法。例如在接收消息文本框中添加文本,代码如下

 this.txtRecMsg.Invoke(rectxtBack,str);

  str:文本变量。

  rectxtBack:回调方法

 将接收到的消息写入到文本框的方法代码:

        private void setRec(string str)
        {
            txtRecMsg.AppendText(str + "\r\n");
        }

 声明委托回调并示例化

        //定义回调
        private delegate void SetTextCallBack(string strValue);
        //声明
        private SetTextCallBack setTextCallBack;

        //实例化代码,写在事件内
        setTextCallback = new SetTextCallBack(setRec);

 

使用控件的Invoke方法在线程中安全访问控件 

       /// <summary>
        /// 接口服务器发送的消息
        /// </summary>
        private void Recive()
        {
            {
                string str = “接收到的消息”;
                this.txtRecMsg.Invoke(setTextCallback,str);
            }

        }

 

在线程中调用此方法

        threadRecive = new Thread(new ThreadStart(Recive));
        //设置为后台线程
        threadRecive.IsBackground = true;
        threadRecive.Start(); 

  

至此,设计到线程如何将消息表述到控件中的事情算完成了。还是比较麻烦,得想办法进一步优化。不过还是把功能实现了再说。

下一步的工作是声明和组织Socket进行通信

        //创建连Socket
        Socket socketSend; 

写一个事件,进行远程服务器连接

        private void btnConnection_Click(object sender, EventArgs e)
        {
            try
            {
                socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtIP.Text.Trim());
                socketSend.Connect(ip, Convert.ToInt32(txtPort.Text.Trim()));
                //实例化回调
                rectxtBack = new SetTextCallBack(setRec);//开启一个新线程,不停接收服务器发送消息线程
                threadRecive = new Thread(new ThreadStart(Recive));
                //设置为后台线程
                threadRecive.IsBackground = true;
                threadRecive.Start();

            }
            catch (Exception ex)
            {

                MessageBox.Show("连接服务端出错:" + ex.ToString());
            }
        }

完整的Recive方法

        /// <summary>
        /// 接口服务器发送的消息
        /// </summary>
        private void Recive()
        {
            try
            {
                while (true)
                {
                    byte[] buffer = new byte[2048];
                    //实际接收到的字节数
                    int r = socketSend.Receive(buffer);
                    if (r == 0)
                    {
                        break;
                    }
                    else
                    {
                        string str = Encoding.Default.GetString(buffer, 0, r - 1);
                        this.txtRecMsg.Invoke(rectxtBack,str);
                    }

                }
            }
            catch (Exception ex)
            {

                MessageBox.Show("接收服务端发送的消息出错:" + ex.ToString());
            }
        }

至此,我们就可以通过sscom工具,配置成服务器模式,来测试能否成功接收服务器发来的消息。

做一个小总结,看看我们都需要干哪些事情:

  • 声明一个Socket
  • 声明一个委托
  • 写文本框插入消息的方法
  • 实例化委托时,调用这个方法。
  • 写线程调用方法(格式化接收数据。用Invoke方法将数据写入控件中this.invoke(委托实例,接收到的字符))
  • 声明线程,将线程设置为后台模式,启动线程


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM