Socket 编程(二)

首先,看主界面

点击链接按钮,开始建立与服务端的连接

  Socket socket = null;
        private void btnStart_Click(object sender, EventArgs e)
        {
            IPAddress ip = IPAddress.Parse(txtIP.Text);            //获取IP地址
            IPEndPoint enpoint = new IPEndPoint(ip, int.Parse(txtPort.Text));   //获取网络端点(IP+端口号)
            //创建Socket对象,连接服务器端
            socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);    
            try
            {
                socket.Connect(enpoint);                                 //连接
                SetText("连接成功!");
                this.btnStart.Enabled = false;                           //连接成功后,按钮禁用

                //接收服务器消息
                Thread th = new Thread(RecMsg);                  //在另一个线程中接收服务端发来的信息
                th.Start();
            }
            catch(Exception ex)
            {
                SetText(ex.Message);
            }
        }

那么我们再来看看这个RecMsg方法

    void RecMsg()
        {
            while (true)
            {
                byte[] buffer = new byte[1024 * 1024 * 5];       //消息大小不能超过5M
                int count = -1;
                try
                {
                    //接收的有效信息
                    count = socket.Receive(buffer);
                }
               catch(Exception ex)
                {
                    SetText(ex.Message);
                    break;
                }

                int flag=buffer[0];        、//获取消息的第一个字节,0代表是字符,1代表是文件
                if (flag == 0)//接收文字
                {
                    //首字节是标示符,所以重第二个位置开始转换
                    string s = Encoding.UTF8.GetString(buffer, 1, count-1);   
                    SetText(s);
                }
                else if (flag == 1)//接收文件
                {
                    SaveFileDialog sfd = new SaveFileDialog();
                    if (sfd.ShowDialog(this) == DialogResult.OK)
                    {
                        //创建文件流
                        using (FileStream fs = new FileStream(sfd.FileName, FileMode.Create))               
                        {
                            fs.Write(buffer, 1, count - 1);          //将buffer中的数据写入到文件流中
                            MessageBox.Show("保存车成功!");
                        }
                    }
                }
            }
        }

现在我们已经能接收到服务端发来的消息了,再来看看向服务端发送消息

   private void btnSend_Click(object sender, EventArgs e)
        {
            if (socket != null)
            {
                try
                {
                    byte[] buffer = Encoding.UTF8.GetBytes(txtMessage.Text);
                    socket.Send(buffer);
                }
                catch(Exception ex)
                {
                    SetText(ex.Message);
                }
            }
        }
    }

最后提示一下:要在窗体构造函数中添加一行代码

  Control.CheckForIllegalCrossThreadCalls = false;

允许主线程以外的线程访问窗体上的控件 。

原文地址:https://www.cnblogs.com/wywnet/p/3331053.html