• 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;

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

  • 相关阅读:
    Java安全之Filter权限绕过
    Java学习之struts2使用
    Java学习之Hibernate框架使用
    Java学习之Maven使用
    .Net Core3.1中SameSite的使用方法、遇到的问题以及解决办法
    .Net Core 3.1简单搭建微服务
    在VM虚拟机中安装FTP服务
    Hyper-V中的虚拟机(Centos)安装FTP服务
    Docker相关操作
    .Net Core 3.1 服务端配置跨域
  • 原文地址:https://www.cnblogs.com/wywnet/p/3331053.html
Copyright © 2020-2023  润新知