一般用套接字传输信息。
客户端程序:
1. 打开VS.net,新建一个C#的模板为“Windows 应用程序”的项目,不妨命名为“ChatClient”。
2. 布置界面。往界面上添加一个ListBox控件(用于显示用户列表),一个RichTextBox控件(用于显示聊天消息以及系统消息),一个TextBox控件(用于发送消息),一个CheckBox控件(确定是否为悄悄话),一个StatusBar控件以及四个Button控件(分别为“连接”、“断开连接”、“开始记录”、“发送”)。各个控件的属性设置可以参见源代码中的具体设置,这里从略。
3. 客户端程序的代码编写。
当客户端试图和服务器端进行连接时,一个连接必须建立而且得向服务器端进行注册。 EstablishConnection()函数运用一个TcpClient来和服务器端取得连接,同时创建一个NetworkStream来发送消息。还有,端口号和服务器端的是保持一致的,均为5555。EstablishConnection()函数如下:

private void EstablishConnection() 

{ 

statusBar1.Text = "正在连接到服务器"; 

try 

{ 

clientsocket = new TcpClient(serveraddress,serverport); 

ns = clientsocket.GetStream(); 

sr = new StreamReader(ns); 

connected = true; 

} 

catch (Exception) 

{ 

MessageBox.Show("不能连接到服务器!","错误", 

MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 

statusBar1.Text = "已断开连接"; 

} 

} 

在和服务器端连接成功后,程序就用RegisterWithServer()函数向服务器端发送一个CONN命令。该命令先是发送该用户的名称,然后从服务器端获得其他所有用户的列表,所有用户列表是在ListBox控件中显示的。该函数如下: 

private void RegisterWithServer() 

{ 

try 

{ 

string command = "CONN|" + ChatOut.Text; 

Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 

ns.Write(outbytes,0,outbytes.Length); 

string serverresponse = sr.ReadLine(); 

serverresponse.Trim(); 

string[] tokens = serverresponse.Split(new Char[]{'|'}); 

if(tokens[0] == "LIST") 

{ 

statusBar1.Text = "已连接"; 

btnDisconnect.Enabled = true; 

} 

for(int n=1; n 

lbChatters.Items.Add(tokens[n].Trim(new char[]{'/r','/n'})); 

this.Text = clientname + ":已连接到服务器"; 

} 

catch (Exception) 

{ 

MessageBox.Show("注册时发生错误!","错误", 

MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 

} 

} 

在此之后,当然就是用户之间的聊天了,由ReceiveChat()函数来完成。该函数是一个独立的线程,它处理所有用户获得的消息和用户发送的消息。它主要处理了CHAT、PRIV、JOIN、GONE、QUIT等命令,处理的方法和服务器端的类似。具体函数实现如下: 

private void ReceiveChat() 

{ 

bool keepalive = true; 

while (keepalive) 

{ 

try 

{ 

Byte[] buffer = new Byte[2048]; 

ns.Read(buffer,0,buffer.Length); 

string chatter = System.Text.Encoding.ASCII.GetString(buffer); 

string[] tokens = chatter.Split(new Char[]{'|'}); 

if (tokens[0] == "CHAT") 

{ 

rtbChatIn.AppendText(tokens[1]); 

if(logging) 

logwriter.WriteLine(tokens[1]); 

} 

if (tokens[0] == "PRIV") 

{ 

rtbChatIn.AppendText("Private from "); 

rtbChatIn.AppendText(tokens[1].Trim() ); 

rtbChatIn.AppendText(tokens[2] + "/r/n"); 

if(logging) 

{ 

logwriter.Write("Private from "); 

logwriter.Write(tokens[1].Trim() ); 

logwriter.WriteLine(tokens[2] + "/r/n"); 

} 

} 

if (tokens[0] == "JOIN") 

{ 

rtbChatIn.AppendText(tokens[1].Trim() ); 

rtbChatIn.AppendText(" has joined the Chat/r/n"); 

if(logging) 

{ 

logwriter.WriteLine(tokens[1]+" has joined the Chat"); 

} 

string newguy = tokens[1].Trim(new char[]{'/r','/n'}); 

lbChatters.Items.Add(newguy); 

} 

if (tokens[0] == "GONE") 

{ 

rtbChatIn.AppendText(tokens[1].Trim() ); 

rtbChatIn.AppendText(" has left the Chat/r/n"); 

if(logging) 

{ 

logwriter.WriteLine(tokens[1]+" has left the Chat"); 

} 

lbChatters.Items.Remove(tokens[1].Trim(new char[]{'/r','/n'})); 

} 

if (tokens[0] == "QUIT") 

{ 

ns.Close(); 

clientsocket.Close(); 

keepalive = false; 

statusBar1.Text = "服务器端已停止"; 

connected= false; 

btnSend.Enabled = false; 

btnDisconnect.Enabled = false; 

} 

} 

catch(Exception){} 

} 

} 

通过以上的一些函数,客户端程序之间就可以进行自由地聊天了,各个用户之间还可以互相发送悄悄话。所以程序已经实现了聊天室的基本功能了,不过最后各个用户还要正常地退出,那就要用到QuitChat()函数了。该函数的具体实现如下: 

private void QuitChat() 

{ 

if(connected) 

{ 

try 

{ 

string command = "GONE|" + clientname; 

Byte[] outbytes = System.Text.Encoding.ASCII.GetBytes(command.ToCharArray()); 

ns.Write(outbytes,0,outbytes.Length); 

clientsocket.Close(); 

} 

catch(Exception) 

{ 

} 

} 

if(logging) 

logwriter.Close(); 

if(receive != null && receive.IsAlive) 

receive.Abort(); 

this.Text = "客户端"; 

}


到此为止,客户端程序的主要部分都已经介绍完毕。还有一些按钮控件的消息处理函数可以参见源代码。同时,程序中还有一个聊天记录功能,该功能和现在流行的聊天软件的记录功能类似。不过限于篇幅,在这里就不一一介绍了,有兴趣的读者可以研究一下本文后面的源代码。
这样,客户端程序就完成了。程序运行图示如下:
总结:
本文向大家初步介绍了套接字的基本概念和实现套接字编程的基本原理,还通过一个很好的实例向大家展示了在C#下进行套接字编程的实现方法和一些编程技巧。从中,我们不难发现运用C#进行套接字编程乃至网络编程有许多优越之处。实例程序实现的思路清晰明了而且通俗易懂,是一个相当不错的例子,希望各位能好好研读。同时还希望大家能进一步完善该程序,使之功能更强大、界面更友好。