总结哈子:
服务器端
//获得本地IPAddress的对象
static void Main(string args[])
{
IPAddress ipAddr=Dns.Resolve("sjk49").AddressList[0];
//初始化监听套接字,在指定的IP和端口监听
TcpListener clientListener=new TcpListener(ipAddr,ECHO_PORT);
//开始监听
clientListener.Start();
Console.WriteLine("Waiting for connections...");
while(true)
{
//接受挂起的连接请求,返回一个单独与客户端通信的TcpClient
TcpClient client=clientListener.AcceptTcpClient();
ClientHandler cHandler=new ClientHandler();
cHandler.clientSocket=client;
Thread clientThread=new Thread(new ThreadStart(cHandler.RunClient));
clientThread.Start();
if(nClients<=0)
break;
}
}
这里由于是一个服务器端,多个客户端,所以定义了一个ClientHandler类专门来处理与各个客户端进行通信,主线程不断地接受客户端发起的连接.并创立相应的客户端处理线程及其相应的委托方法来处理.
ClientHandler类
public class ClientHandler
{
public TcpClient clientSocket;
public void RunClient()
{
StreamReader readerStream=new StreamReader(clientSocket.GetStream());
NetworkStream writerStream=clientSocket.GetStream();
string returnData=readerStream.ReadLine();
string userName=returnData;
Console.WriteLine("Welcome"+userName+"to the Server"); while(true)
{
returnData=readerStream.ReadLine();
if(returnData.IndexOf("QUIT")>-1)
{
Console.WriteLine("Bye Bye"+userName);
break;
}
Console.WriteLine(userName+":"+returnData);
returnData+="\r\n";
byte[]dataWrite=Encoding.ASCII.GetBytes(returnData);
writerStream.Write(dataWrite,0,dataWrite.Length);
}
clientSocket.Close();
}
}
一个通常的服务器端使用两个Socket,一个是TcpListener,另一个在接受某个客户端的连接时返回,而它们之间的通信可以用Socket的Send()和Receive()方法或者利用网络流NetWorkStream