• Tcp通信与多线程【转】


    服务器端

    Socket socketWatch = null;
            Thread threadWatch = null;
    
            Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
            Dictionary<string, Thread> dicThread = new Dictionary<string, Thread>();
    
    socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress address = IPAddress.Parse(ipTb.Text.Trim());
                IPEndPoint endPoint = new IPEndPoint(address, int.Parse(portTb.Text.Trim()));
    
                try
                {
                    socketWatch.Bind(endPoint);
                }
                catch (Exception ex)
                {
    
                    MessageBox.Show("异常:" + ex.Message);
                    return;
                }
                socketWatch.Listen(10);
    
                threadWatch = new Thread(WatchConnecting);
                threadWatch.IsBackground = true;
                threadWatch.Start();
           //为每一个连进来的socket创建线程
            private void WatchConnecting()
            {
                while (true)
                {
                    Socket sokConnection = socketWatch.Accept();
                    lb.Items.Add(sokConnection.RemoteEndPoint.ToString());
    
                    dicSocket.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);
                    ShowMsg("客户端连接成功");
    
                    Thread th = new Thread(RecMsg);
                    th.IsBackground = true;
                    th.Start(sokConnection);
                    dicThread.Add(sokConnection.RemoteEndPoint.ToString(), th);
    
    
                }
            }

    信息接收

            private void RecMsg(object sokConnection)
            {
                Socket sokClient = sokConnection as Socket;
    
                while (true)
                {
                    byte[] arrMsgRec = new byte[1025 * 1024 * 2];
    
                    int length = -1;
    
                    try
                    {
                        length = sokClient.Receive(arrMsgRec);
                    }
                    catch (Exception ex)
                    {
    
                        ShowMsg("异常:" + ex.Message);
                        dicThread.Remove(sokClient.RemoteEndPoint.ToString());
                        dicThread.Remove(sokClient.RemoteEndPoint.ToString());
                        lb.Items.Remove(sokClient.RemoteEndPoint.ToString());
    
                    }
                    if (arrMsgRec[0] == 0)//msg
                    {
                        string strMsg = System.Text.Encoding.UTF8.GetString(arrMsgRec, 1, arrMsgRec.Length - 1);
    
                        ShowMsg(strMsg);
                    }
                    if (arrMsgRec[0] == 1)//file
                    {
                        SaveFileDialog sfd = new SaveFileDialog();
                        if (sfd.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
                        {
                            string fileSavePath = sfd.FileName;
                            using (FileStream fs = new FileStream(fileSavePath, FileMode.Create))
                            {
                                fs.Write(arrMsgRec, 1, arrMsgRec.Length - 1);
                                ShowMsg("文件保存成功");
                            }
                        }
                    }
    
                }
            }

    信息发送

     byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
                byte[] arrSendMsg = new byte[arrMsg.Length + 1];
                arrSendMsg[0] = 0;
                Buffer.BlockCopy(arrMsg, 0, arrSendMsg, 1, arrMsg.Length);
    
                string strKey = lb.Text.Trim();
                if (string.IsNullOrEmpty(strKey))
                {
                    dicSocket[strKey].Send(arrSendMsg);
                    ShowMsg(strMsg);
                    msgStb.Clear();
    
                }

    客户端

    //根据目标ip直接连接
                IPAddress ip = IPAddress.Parse(iptb.Text.Trim());
                IPEndPoint endPoint=new IPEndPoint(ip,int.Parse(potb.Text.Trim()));
                socketClient=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    
                try
                {
                    ShowMsg("与服务器连接中...");
                    socketClient.Connect(endPoint);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    return;
                }
    
                ShowMsg("与服务器连接成功...");
                threadClient = new Thread(RecMsg);
                threadClient.IsBackground = true;
                threadClient.Start();
  • 相关阅读:
    操作系统精髓读书笔记
    springboot 项目中读取资源文件内容 如图片、文档文件
    重构-改善既有代码的设计读书小结
    投资中最简单的事读书笔记
    公司的行业差异
    Linux-TCP之深入浅出send和recv
    Linux-socket的close和shutdown区别及应用场景
    C-pthread_cond_wait 详解
    Linux-文件描述符的本质及与文件指针的区别
    数据结构-树的进化及与数据库的关系
  • 原文地址:https://www.cnblogs.com/tgdjw/p/4516351.html
Copyright © 2020-2023  润新知