连接之后,启动一个线程。
Thread t = new Thread(new ThreadStart(ThreadProc));
t.Start();private void ThreadProc()
{
while(true)
{
Done.Reset(); 
serverSocket.BeginAccept(new AsyncCallback
                    (AcceptCallBack),serverSocket);
Done.WaitOne(); 
Thread t1 = new Thread(new ThreadStart(ThreadProc));
t1.Start();
}
}
有连接后,再启动一个线程,是不是不对呀。

解决方案 »

  1.   

    楼主请参考这个...
    http://blog.csdn.net/zhiang75/archive/2004/08/16/75915.aspx
      

  2.   

    private Thread mobjThread ;
    private TcpListener mobjListener ;
    private void Form1_Load(object sender, System.EventArgs e)
    {
    //init
    mobjThread = new Thread ( new ThreadStart ( DoListen ) ) ;
    mobjThread.Priority = ThreadPriority.Highest ;
    mobjThread.Start ( ) ;
    }
    private void InitClient ( TcpClient client )
    {
    Client myClient = new Client ( client ) ;
    //AddHandler x.Connected, AddressOf OnConnected
    myClient.Disconnected += new Client.DisconnectedHandler( this.OnDisconnected ) ;
    myClient.DataReceiveDecoded += new Client.DataReceiveDecodedHandler( this.OnDataReceiveDecoded ) ;
    myClient.SlaveArriaval += new Client.SlaveArriavalHandler ( this.OnSlaveArriaval ) ;
    myClient.SlaveMessageArriaval += new Client.SlaveMessageArriavalHandler( this.OnSlaveMessageArriaval ) ;
    }
    //=============================================================================
    // 事件响应的处理函数
    // DoListen: 打开 TcpListener:mobjListener
    //=============================================================================
    private void DoListen ( )
    {
    listMsg.Items.Add ( "DoListen开始监听" ) ;
    try
    {
    int listenPort = int.Parse( System.Configuration.ConfigurationSettings.AppSettings["listenPort"] ) ;
    // IPAddress addr = IPAddress.Parse ( "192.168.1.19" ) ; mobjListener = new TcpListener( addr , listenPort ) ;
    mobjListener = new TcpListener( listenPort ) ;
    mobjListener.Start ( ) ;
    while ( true ) //一直监听
    {
    TcpClient client = mobjListener.AcceptTcpClient ( ) ;//有客户连接,就新建一个TcpClient 类
    InitClient ( client ) ;
    }
    }
    catch ( Exception ee )
    {
    throw new Exception ( "产生了一个错误->" + ee.ToString ( ) ) ;
    }
    }
      

  3.   

    happyjun2000(蓝色游侠∮不要介意我无聊乱接分.NET) 的代码很好,能实现楼主的需求
      

  4.   

    楼上几位说的再明白一点好么。是说可以在InitClient里做一些东西么?比如我现在在这里面定义一个client的列表,等等。
    我目前的方法类似于zhiang75(zhiang75) 说的。
      

  5.   

    只开一个线程监听就可以了,有连接就启动异步处理:
    byte[] bytes = new Byte[1024];


    IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    int serverport=Convert.ToInt32(this.txtServerPort.Text.Trim());
    IPEndPoint localEndPoint = new IPEndPoint(ipAddress,serverport);

    Socket listener = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream, ProtocolType.Tcp );

    try 
    {
    listener.Bind(localEndPoint);
    listener.Listen(100);

    while (true) 
    {

    allDone.Reset();


    Console.WriteLine("Waiting for a connection...");
    listener.BeginAccept( 
    new AsyncCallback(AcceptCallback),
    listener );
      

  6.   

    {
    ...
    Thread t = new Thread(new ThreadStart(ThreadProc));
    t.Start();
    }
    private void ThreadProc()
    {
    while(true)
    {
    Done.Reset();
    serverSocket.BeginAccept(new AsyncCallback
                          (AcceptCallBack),serverSocket);
    Done.WaitOne();
    }
    }
    private void AcceptCallBack(IAsyncResult ar)//ar表示??操作的状?。
    {
    Done.Set();
    mySocket=(Socket)ar.AsyncState;
    handler=mySocket.EndAccept(ar);
    //add client info to Client_list
    clientList[clientNum] = handler;
    clientNum += 1;

    Thread thread=new Thread(new ThreadStart(ThreadRev));
    thread.Start();
    }
    private void ThreadRev()
    {
    handler.BeginReceive(buffer,0,BufferSize,0,new AsyncCallback
                  (ReadCallBack),handler);
    }
    private void ReadCallBack(IAsyncResult ar)
    {
    ...①
    int bytesRead=handler.EndReceive(ar); //?束挂起的???取,返回接收到的字?数。
    ...②
    handler.BeginReceive(buffer,0,BufferSize,0,new AsyncCallback
                  (ReadCallBack),handler);
    }
    上面是我的server代码,如果只是与server端连接,问题不大,现在分别从各个client向server发信息。Server到底怎么样才能分辨到底是那个client发来的信息呢?也就是上面的程序①的位置,怎么去判断呢。或者说,一个线程里同一时间,只能有一个接收处于阻塞状态(我不清楚)。
      

  7.   

    不需要判断,server端会根据client的连接socket得到client的所有信息
             mySocket=(Socket)ar.AsyncState这个socket里有你要的一切信息(ip,port..),如果server要向 client回发,用这个就可以
      

  8.   

    是说这是个当前的一个client,如果是以前连接的一个呢,会怎么样呢?