客户端:
 Thread threadClient = null;//客户端 负责接收 服务器发来的数据消息的线程
 Socket socketClient = null;//客户端套接字 private void button1_Click(object sender, EventArgs e)
{
            //可以把文本IP 转成IP对象
IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtDuanKou.Text.Trim()));
socketClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //向指定的IP和端口发送连接请求
socketClient.Connect(endpoint);            //创建线程 监听服务器 发来的信息
threadClient = new Thread(RecMsg);
threadClient.IsBackground = true;
threadClient.Start(); 
        }  //客户端发送信息
  private void btnFaShong_Click(object sender, EventArgs e)
{
string xinXi = "ok";
            //将要发送的字符串转换UTF8对应的字节数组
byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(xinXi);
socketClient.Send(arrMsg);
//输出发送信息
ShowMsg("客户端发送的消息:" + xinXi);
服务器:
Thread threadWatch = null;//定义一个线程,负责监听客户端连接请求的线程
Socket socketWatch = null;//负责监听的快捷字
Thread jieshou = null;//负责接收数据private void button1_Click(object sender, EventArgs e)
{
            //创建负责监听的快捷字,参数(使用IP4寻址协议,使用流逝连接,使用TCP协议传输数据)
            socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());            //创建IP 和端口的网络节点对象
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtDuanKou.Text.Trim()));            //将负责监听的套接字 绑定到唯一的IP和端口上
            socketWatch.Bind(endpoint);
            //设置监听队列的长度
            socketWatch.Listen(5);            //创建负责监听的线程,并传入监听方法
            threadWatch = new Thread(WachChonecting);                                threadWatch.IsBackground = true;//设置为后台线程
            threadWatch.Start();//开启线程
            ShowMsg("服务器启动监听成功");            //接收数据
            jieshou = new Thread(JieShou);
            jieshou.IsBackground = true;
            jieshou.Start();
            ShowMsg("客户端发来的消息");

        }        //准备一个集合
        Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
        Socket socketConnection = null;      //  Socket socketConnection = null;//负责通信的套接字
        //为了让线程执行Accept方法,监听客户端请求的方法
        void WachChonecting() 
        {
            while (true)//循环是为是了持续不断的新的客户端了连接请求
            {
                //开始监听客户端 Accept方法,会阻断当前线程
                socketConnection = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责跟客户端通信的套接字sokConnect
                //向里面追加一个项
                lbOnline.Items.Add(socketConnection.RemoteEndPoint.ToString());                //将与客户端套接字对象添加到键值对集合中,并与客户端IP端口作为键
                dict.Add(socketConnection.RemoteEndPoint.ToString(),socketConnection);
               //窗体输出信息
                ShowMsg("客户端连接成功");            }
           
        }      //循环接收
        void JieShou() {
       while (true)
            {
                socketConnection = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责跟客户端通信的套接字sokConnect
                //定义一个接收的字节数组
                byte[] arrMsgJie = new byte[1024];
             
                int length = socketConnection.Receive(arrMsgJie);
                string strMsgJie = System.Text.Encoding.UTF8.GetString(arrMsgJie, 0, length);
                ShowMsg("接收来的数据:"+strMsgJie);
            }

        }socket多线程

解决方案 »

  1.   

    问题在服务器;
    当服务器Accept到后,你就在当前线程里去再次开辟一个线程去接收数据。
    服务器:
    Thread threadWatch = null;//定义一个线程,负责监听客户端连接请求的线程
    Socket socketWatch = null;//负责监听的快捷字
    Thread jieshou = null;//负责接收数据private void button1_Click(object sender, EventArgs e)
    {
                //创建负责监听的快捷字,参数(使用IP4寻址协议,使用流逝连接,使用TCP协议传输数据)
                socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp);
                IPAddress address = IPAddress.Parse(txtIP.Text.Trim());            //创建IP 和端口的网络节点对象
                IPEndPoint endpoint = new IPEndPoint(address, int.Parse(txtDuanKou.Text.Trim()));            //将负责监听的套接字 绑定到唯一的IP和端口上
                socketWatch.Bind(endpoint);
                //设置监听队列的长度
                socketWatch.Listen(5);            //创建负责监听的线程,并传入监听方法
                threadWatch = new Thread(WachChonecting);                                threadWatch.IsBackground = true;//设置为后台线程
                threadWatch.Start();//开启线程
                ShowMsg("服务器启动监听成功");
                /*
                //接收数据
                jieshou = new Thread(JieShou);
                jieshou.IsBackground = true;
                jieshou.Start();
                ShowMsg("客户端发来的消息");
                */
            }        //准备一个集合
            Dictionary<string, Socket> dict = new Dictionary<string, Socket>();
            Socket socketConnection = null;      //  Socket socketConnection = null;//负责通信的套接字
            //为了让线程执行Accept方法,监听客户端请求的方法
            void WachChonecting() 
            {
                while (true)//循环是为是了持续不断的新的客户端了连接请求
                {
                    //开始监听客户端 Accept方法,会阻断当前线程
                    socketConnection = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责跟客户端通信的套接字sokConnect
                    //向里面追加一个项
                    lbOnline.Items.Add(socketConnection.RemoteEndPoint.ToString());                //将与客户端套接字对象添加到键值对集合中,并与客户端IP端口作为键
                    dict.Add(socketConnection.RemoteEndPoint.ToString(),socketConnection);
                   //窗体输出信息
                    ShowMsg("客户端连接成功");
                     /*
                //接收数据
                Thread newth= new Thread(JieShou);//局部开辟线程,不要全局
                jieshou.IsBackground = true;
                jieshou.Start();
                ShowMsg("客户端发来的消息");            }
               
            }      //循环接收
            void JieShou() {
           while (true)
                {
                    socketConnection = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个负责跟客户端通信的套接字sokConnect
                    //定义一个接收的字节数组
                    byte[] arrMsgJie = new byte[1024];
                 
                    int length = socketConnection.Receive(arrMsgJie);
                    string strMsgJie = System.Text.Encoding.UTF8.GetString(arrMsgJie, 0, length);
                    ShowMsg("接收来的数据:"+strMsgJie);
                }
            } 
    你的代码写的真心乱哪。。