在学习写Socket通讯,服务器跟客户端直接发送消息,出现了问题

客户端开启了一个新的线程来接收服务器发过来的消息,生成的时候没有问题,但是点启动通知打开两个实例(客户端)(服务器)就会显示第二个实例正在被另一个线程占用,无法打开次文件,及时打开第二个实例,也发送不了

  private void button1_Click(object sender, EventArgs e)
        {
            //创建一个负责监听的socket
            Socket socketwatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建Ip地址跟端口号
            IPAddress ip = IPAddress.Any;
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));
            //让负责监听的socket绑定ip地址跟端口号
            socketwatch.Bind(point);

            ShowMsg("监听成功");

            Thread th = new Thread(Listen);
            th.IsBackground = true;
            th.Start(socketwatch);

            //设置监听队列
            socketwatch.Listen(10);
            //负责监听的socket来接收客户端的连接
           
        }
        //等待客户端的连接,并且创建与之通信的socket
        Socket socketsend;
        void Listen(object o)
        {
            Socket socketwatch = o as Socket;
            while (true)
            {
                socketsend = socketwatch.Accept();
                ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + "连接成功");
                //客户端连接成功后,服务器应该接受客户端发来的消息
                Thread th = new Thread(Recive);
                th.IsBackground = true;
                th.Start(socketsend);
                   

            }
           

        }
        void Recive(object o)
        {
            Socket socketwatch = o as Socket;
            while(true)
            {
                byte[] buffer = new byte[1024 * 1024 * 2];
                //实际接受到的有效字节数
                int r = socketsend.Receive(buffer);
                if (r == 0)
                {
                    break;
                }
                string str = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(socketsend.RemoteEndPoint + ":" + str);
            }

        }


                void ShowMsg(string str)
        {
           textBox3.AppendText(str + "\r\n");
                



        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        //服务器给客户端发送消息
        private void button4_Click(object sender, EventArgs e)
        {
            string str = textBox4.Text;
            byte[] buffer = Encoding.UTF8.GetBytes(str);
            socketsend.Send(buffer);
        }

       


  private void button1_Click(object sender, EventArgs e)
        {
            //创建负责通信的socket
            socketsend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(textBox1.Text);
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(textBox2.Text));
            socketsend.Connect(point)

            ShowMsg("连接成功");
           Thread th = new Thread(Recive);
           th.IsBackground = true;
           th.Start(socketsend);
        }

       /void Recive(object o)
        {
          while (true)
       {
              byte[] buffer = new byte[1024 * 1024 * 3];
           int r = socketsend.Receive(buffer);
               if (r == 0)
              {
                   break;
              }
               string s = Encoding.UTF8.GetString(buffer, 0, r);
                ShowMsg(socketsend.RemoteEndPoint + ":" + s);
            }
       }

        void  ShowMsg(string str)
        {
            textBox3.AppendText(str + "\r\n");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            string str = textBox4.Text.Trim();
            byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
            socketsend.Send(buffer);
        }

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



在.net进行调试时,所有的类库文件都是独占模式

如果你两个程序公用了一个或多个类库,那么就只能调试1个,另一个用生成好的文件直接运行

应该有2个程序,一个客户端程序,一个服务器端程序。

启动的两个客户端程序,端口号不能一样。