Socket 编程(二)

首先,看主界面

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;

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

 

你可能感兴趣的:(socket)