C#教程:开发TCP/IP聊天室实例|方法
开发TCP/IP聊天室
本示例通过TCP实现在客户端与服务器端计算机之间进行通信。本实例运行时,首先打开服务器端程序,输入用户名单击【登录】按钮完成服务器的开启;然后运行客户端程序,同时输入用户名,登录程序(这里的端口号都默认为11000),然后单击任何一方的【发送】按钮,对方将收到信息,并显示在自己的信息列表中。实例运行结果如图1和图2所示。

图1 “服务器”运行窗体

图2“客户端”运行窗体
服务器端实现的具体步骤如下所示。
(1)在VS2005项目中添加一个窗体。
(2)在窗体中添加3个TextBox文本框,分别用于获取用户名、显示与发送信息。
(3)在窗体中添加3个Button按钮和3个Label控件,分别用于激发事件和显示信息。
(4)程序主要代码。
首先添加对命名空间的引用,代码如下:
using System.Net;
using System.Threading;
using System.Net.Sockets;
然后定义在程序中要用到的变量,代码如下:
#region//定义变量
IPAddress HostIP = IPAddress.Parse("127.0.0.1");
IPEndPoint point;
Socket socket;
bool flag = True;
Socket acceptedSocket;
#endregion
单击【登录】按钮,实例化一个Socket对象,令其开始侦听,当侦听到信息时,开启一个新的进程,调用新的方法(Proccess)显示信息。【登录】按钮的Click事件代码如下:
private void button1_Click_1(object sender, EventArgs e)
{
HostIP = IPAddress.Parse("127.0.0.1");
try
{
point = new IPEndPoint(HostIP, Int32.Parse("11000"));
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
socket.Bind(point);
socket.Listen(50);
acceptedSocket = socket.Accept();
Thread thread = new Thread(new ThreadStart(Proccess));
thread.Start();
}
catch (Exception ey)
{
MessageBox.Show(ey.Message);
}
}
声明委托以及委托所要代理的事件,为进行调用控件作准备,代码如下:
#region//声明委托
delegate void SetTextCallback(string text);
private void SetText(string text)
{
textBox2.AppendText(text + "rn");
}
#endregion
进程所要调用的方法,用于显示来自其他机器的信息。代码如下:
#region//进程方法
private void Proccess()
{
if (acceptedSocket.Connected)
{
while (flag)
{
byte[] receiveByte = new byte[64];
acceptedSocket.Receive(receiveByte, receiveByte.Length, 0);
string strInfo = Encoding.BigEndianUnicode.GetString(receiveByte);
this.Invoke(new SetTextCallback(SetText), new object[] { strInfo });
}
}
}
#endregion
通过Socket类的Send方法,实现信息的发送。【发送】按钮的Click事件代码如下:
private void button2_Click_1(object sender, EventArgs e)
{
try
{
Byte[] sendByte = new Byte[64];
string sendStr = this.textBox1.Text + ":" + this.textBox3.Text + "rn";
sendByte = Encoding.BigEndianUnicode.GetBytes(sendStr.ToCharArray());
acceptedSocket.Send(sendByte, sendByte.Length, 0);
}
catch { }
}
客户端实现的具体步骤如下所示。
(1)在VS2005项目中添加一个窗体。
(2)在窗体中添加3个TextBox文本框,分别用于获取用户名、显示与发送信息。
(3)在窗体中添加3个Button按钮和3个Label标签,分别用于激发事件和显示信息。
(4)程序主要代码。
单击客户端窗体中的【登录】按钮,通过Socket类的Connect方法连接到指定的机器,同时也开启一下新的进程。【登录】按钮的Click事件代码如下:
private void button1_Click(object sender, EventArgs e)
{
HostIP = IPAddress.Parse("127.0.0.1");
try
{
point = new IPEndPoint(HostIP, Int32.Parse("11000"));
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
socket.Connect(point);
Thread thread = new Thread(new ThreadStart(Proccess));
thread.Start();
}
catch(Exception ey)
{
MessageBox.Show("服务器没有开启rn"+ey.Message);