连接之后,启动一个线程。
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();
}
}
有连接后,再启动一个线程,是不是不对呀。
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();
}
}
有连接后,再启动一个线程,是不是不对呀。
http://blog.csdn.net/zhiang75/archive/2004/08/16/75915.aspx
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 ( ) ) ;
}
}
我目前的方法类似于zhiang75(zhiang75) 说的。
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 );
...
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发来的信息呢?也就是上面的程序①的位置,怎么去判断呢。或者说,一个线程里同一时间,只能有一个接收处于阻塞状态(我不清楚)。
mySocket=(Socket)ar.AsyncState这个socket里有你要的一切信息(ip,port..),如果server要向 client回发,用这个就可以