c#学习记录day15

客户端和服务端的连接

服务端

private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                //创建一个负责监听的Socket
                Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtServer.Text);
                IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
                //开启监听
                socketWatch.Bind(point);
                //设置监听队列
                socketWatch.Listen(5);
                //ShowMsg("等待连接");
                txtMsg.AppendText("等待连接" + "\r\n");
                //设置新线程接收客户端的连接
                Thread th = new Thread(Accepts);
                th.IsBackground = true;
                th.Start(socketWatch);
            }
            catch(Exception ex)
            {
                //txtMsg.AppendText("每个套接字地址(协议/网络地址/端口)只允许使用一次");
                txtMsg.AppendText(ex.Message);
            }

}
        //储存客户端的IP地址和服务端负责跟客户端通信的Socket
        Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
        //接受客户端的连接
        void Accepts(object apt)
        {
            while (true)//用于接收多个客户端的连接
            {
                Socket socketWatch = apt as Socket;
                //创建一个负责接收的Socket
                Socket socketTX = socketWatch.Accept();
                //ShowMsg(socketTX.RemoteEndPoint.ToString() + "连接成功");
                txtMsg.AppendText(socketTX.RemoteEndPoint.ToString() + ":" + "连接成功" + "\r\n");
                //创建新线程,接收客户端的信息
                Thread th = new Thread(RecMsg);
                th.IsBackground = true;
                th.Start(socketTX);
                //将客服端的地址加入comboBox中
                cboUser.Items.Add(socketTX.RemoteEndPoint.ToString());
                //存储客户端和与之通信的服务端的Socker
                dic.Add(socketTX.RemoteEndPoint.ToString(), socketTX);
            }

        }

        void RecMsg(object apt)
        {
            while (true)//多次接受用户信息
            {
                try
                {
                    Socket socketTX = apt as Socket;
                    //接收客户端发送过来的消息
                    byte[] buffer = new byte[1024];
                    int r = socketTX.Receive(buffer);
                    //把字节数组,转换成字符串
                    string msg = Encoding.Default.GetString(buffer);
                    txtMsg.AppendText(msg + "\n");
                }
                catch
                {
                    txtMsg.AppendText("客户端异常");
                    break;
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        
        
        private void btnSend_Click(object sender, EventArgs e)
        {
            if (cboUser.SelectedIndex == -1)
            {
                return;
            }
            else
            {
                //获取发送的信息
                string str = txtLog.Text.Trim();
                byte[] buffer = Encoding.Default.GetBytes(str);
                List<byte> list = new List<byte>();
                list.Add(0);//标记
                list.AddRange(buffer);//发送的内容
                byte[] buffer1 = list.ToArray();
                //获取客户端IP
                string ip = cboUser.SelectedItem.ToString();
                dic[ip].Send(buffer1);
                txtLog.Clear();
            }

        }
        OpenFileDialog file = new OpenFileDialog();
        private void btnSelect_Click(object sender, EventArgs e)
        {
            file.Title = "选择要发送的文件";
            file.InitialDirectory = @"E:\Desktop\1.txt";
            file.Multiselect = false;
            file.Filter = "文本文件|*.txt|所有文件|*.*";
            file.ShowDialog();
            txtPath.Text = file.FileName;
        }

        private void btnFile_Click(object sender, EventArgs e)
        {
            if (cboUser.SelectedIndex == -1)
            {
                return;
            }
            else
            {
                if (!string.IsNullOrEmpty(file.FileName))
                {
                    using (FileStream fsRead = new FileStream(txtPath.Text, FileMode.Open, FileAccess.Read))
                    {
                        byte[] buffer = new byte[1024];
                        int r = fsRead.Read(buffer, 0, buffer.Length);
                        List<byte> list = new List<byte>();
                        list.Add(1);
                        list.AddRange(buffer);
                        byte[] buffer1 = list.ToArray();
                        dic[cboUser.SelectedItem.ToString()].Send(buffer1, 0, r + 1, SocketFlags.None);
                    }
                }
            }
        }

        private void btnShock_Click(object sender, EventArgs e)
        {
            if (cboUser.SelectedIndex == -1)
            {
                return;
            }
            else
            {
                byte[] buffer = new byte[1];
                buffer[0] = 2;
                dic[cboUser.SelectedItem.ToString()].Send(buffer);
            }
        }

客户端

Socket socket;
        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                if (socket == null)//客户端位连接时进行连接
                {
                    //创建一个负责连接的Socket
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    IPAddress ip = IPAddress.Parse(txtServer.Text);
                    IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
                    socket.Connect(point);
                    txtMsg.AppendText("连接成功" + "\r\n");

                    //创建新线程,接收服务器的消息
                    Thread th = new Thread(RecMsg);
                    th.IsBackground = true;
                    th.Start();
                }
                else
                {
                    txtMsg.AppendText("已经连接成功" + "\r\n");
                }
            }
            catch
            {
                txtMsg.AppendText("服务端未响应" + "\r\n");
                socket = null;
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] buffer = Encoding.Default.GetBytes(txtLog.Text);
            socket.Send(buffer);
            txtLog.Clear();
        }
        void RecMsg()
        {
            while (true)
            {
                try
                {
                    byte[] buffer = new byte[1024];
                    int r = socket.Receive(buffer);
                    if (buffer[0] == 0)
                    {
                        string msg = Encoding.Default.GetString(buffer, 1, r - 1);
                        txtMsg.AppendText(msg + "\r\n");
                    }
                    else if (buffer[0] == 1)
                    {
                        SaveFileDialog file = new SaveFileDialog();
                        file.InitialDirectory = @"E:\Desktop";
                        file.Title = "请选择要保存文件的路径";
                        file.Filter = "文本文件|*.txt|所有文件|*.*";
                        file.ShowDialog(this);
                        if (!string.IsNullOrEmpty(file.FileName))
                        {
                            string path = file.FileName;
                            using (FileStream fsWrite = new FileStream(path, FileMode.Create, FileAccess.Write))
                            {

                                fsWrite.Write(buffer, 1, r - 1);
                            }
                            MessageBox.Show("保存成功");
                        }

                    }
                    else if (buffer[0] == 2)
                    {
                        for (int i = 0; i < 1000; i++)
                        {
                            this.Location = new Point(400, 400);
                            this.Location = new Point(425, 425);
                        }
                    }
                }
                catch
                {
                    txtMsg.AppendText("服务端异常");
                    break;
                }

            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值