小小改动:
Socket sk;
Socket newsk;
Thread xc;
private IPAddress getip()
{
IPHostEntry zhuji=Dns.Resolve(Dns.GetHostName());
return zhuji.AddressList[0];
}

private void kaishi()
{
IPAddress ip=getip();
this.label1.Text=getip().ToString();
IPEndPoint dizhi=new IPEndPoint(ip,338);
sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
sk.Bind(dizhi);
sk.Listen(50);
newsk=sk.Accept();
xc=new Thread(new ThreadStart(go));
xc.Start();
}
private void go()
{
int recv;
while(true)
{
byte[] by=new byte[235];
recv=newsk.Receive(by);
string sj=System.Text.Encoding.Default.GetString(by,0,recv);
this.richTextBox1.AppendText(sj);
}
}
private void button2_Click(object sender, System.EventArgs e)
{
kaishi();
}

解决方案 »

  1.   

    private void go()
    {
    while(true)
    {
    newsk=sk.Accept();
    byte[] by=new byte[235];
    newsk.Receive(by);
    string sj=System.Text.Encoding.Default.GetString(by);
    this.richTextBox1.AppendText(sj);
    }
    }
    应该是这一段有问题, 像上面这样的话,如果第一次接受客户端的连接,同第一个客户端之间数据传输不完成断开之前,第二个客户端连接不上是吧?应该在
    newsk=sk.Accept();
    之后,另外启动一个线程去完成接收数据的工作,而让go()来继续等待另外一个客户端的连接。
      

  2.   

    class t
    {
        public Socket newsocket;
        public void go()
        {
            while(true)
            {
                 byte[] by=new byte[235];
                 newsocket.Receive(by);
                 string sj=System.Text.Encoding.Default.GetString(by);
                 this.richTextBox1.AppendText(sj);
             }
         }
    private void kaishi()
    {
      IPAddress ip=getip();
      this.label1.Text=getip().ToString();
      IPEndPoint dizhi=new IPEndPoint(ip,338);
      sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
      sk.Bind(dizhi);
      sk.Listen(50);
      while(true)
      {
        newsk=sk.Accept();
        t thd = new t();
        t.newsocket = newsk;
        xc=new Thread(new ThreadStart(thd.go));
        xc.Start();
      }}
      

  3.   

    有几个细节不对
    class t
    {
        public Socket newsocket;
        public Form1 fm1;   // 指向父窗口
        public void go()
        {
            while(true)
            {
                 byte[] by=new byte[235];
                 newsocket.Receive(by);
                 string sj=System.Text.Encoding.Default.GetString(by);
                 fm1.richTextBox1.AppendText(sj);   // 把 this 改成父窗口
             }
         }
    private void kaishi()
    {
      IPAddress ip=getip();
      this.label1.Text=getip().ToString();
      IPEndPoint dizhi=new IPEndPoint(ip,338);
      sk=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
      sk.Bind(dizhi);
      sk.Listen(50);
      while(true)
      {
        newsk=sk.Accept();
        t thd = new t();
        thd.newsocket = newsk;
        thd.fm1 = this;    // this 传给 thd
        xc=new Thread(new ThreadStart(thd.go));
        xc.Start();
      }}应该差不多了
      

  4.   

    可以在 class t 中设一个 byte[] buffer, 用 newsocket 发送,在 kaishi() 中赋值
      

  5.   

    按照你上面那段,newsocket成为一个新的,发送不起的。
      

  6.   

    不错,结贴了还能回。
    newsk=sk.Accept();
    就是这样的,sk继续侦听,(下一轮循环时会再次阻塞在此)等待新的client请求,newsk是新建的socket(所谓socket是两端的ip加两端的端口),负责通讯;如果再有另外的client,将有新的newsk(又是一个新的socket,也同样传给t中的newsocket)