聊天室程序
实验二:聊天室的开发
实验目的:
• 学习Visual C#.Net Socket类的使用
• 学习基本UI控件的使用
• 学习多线程的开发
• 学习聊天室的原理
实验内容:开发一套聊天室软件。根据已经完成的服务器端和通信信令,开发客户端:
• 能够设置服务器信息,包括服务器地址和服务端口;
• 能够设定用户在聊天室的昵称;
• 能够显示聊天室在线人员列表;
• 用户可以对所有人聊天,也可以对具体某一个人聊天。两人之间还可以进行私聊;
• 滚动显示聊天信息;
• 当有新成员进入聊天室,或者有成员退出聊天室时,会显示提示信息。
具体实验指导,请点击:网络编程实验指导.doc
点击下载实验报告模板:网络编程实验二.doc
点击下载服务器端程序:Server.rar
参考代码:
// 接收线程的处理函数
private void rec()
{
byte [] buff = new byte [buffsize];
while (sock.Connected)
{
// 从网络上接收数据,进而分析数据,根据不同的数据进行不同的处理
// 首先要判断接收到的数据是普通聊天信息还是信令
// 如果是普通聊天信息,接着要判断该聊天信息是否是私了
// 如果是信令,则根据不同的信令来做不同的处理。
// rs表示接受到的字节数
int rs = _____________;
if (rs > 0 )
{
// 将收到的字节数组转化为字符串
string msg = Encoding.BigEndianUnicode.GetString(buff);
msg = msg.Substring( 0 , rs / 2 );
// 提取msg的第一个字符
// 该字符用于判断接受到的数据是普通聊天信息还是信令
string msgtype = msg.Substring( 0 , 1 );
// 将msg的第一个字符丢弃
msg = msg.Substring( 1 );
// 如果接收到的数据是普通聊天信息
if (msgtype == \" * \" )
{
// 这里判断是否是聊天信息
// 并将聊天信息显示在聊天信息框中
//
// 请填写相关代码
//
}
// 如果接收到的数据是信令
else if (msgtype == \" @ \" )
{
// 从msg的前两个字符获取信令的类别
// 具体信令类别请参考实验指导
string cmd = msg.Substring( 0 , 2 );
// 如果是增加昵称的信令:
// 新用户进入聊天室以后,
// 服务器需要把所有已经在线的用户发送给新的用户,
// 此时的信令为:@AN 0 nickname;
// 新用户进入聊天室以后,
// 服务器要通知所有在线用户有新用户进入聊天室,
// 信令为:@AN 1 nickname
if (cmd == \" AN \" )
{
// 从第五个字符开始到信令结束部分,是昵称字段
string nick = msg.Substring( 5 );
// 从第三个字符开始的后面一个字符,是ANTYPE字段,ANTYPE=0或者1
string antype = msg.Substring( 3 , 1 );
// 将昵称加入到用户列表和聊天对象列表
_____________________;
_____________________;
// 如果是新用户进入聊天室,
// 需要在聊天信息框中显示有新用户的到来。
if (antype == \" 1 \" )
{
// 这里填写在聊天信息框中显示有新用户的到来的代码
}
}
// 有用户要退出聊天室时,
// 服务器发送该信令给其他客户端,
// 将离开的用户的离开信息通知给其余在线用户。
if (cmd == \" DN \" )
{
// 这里填写在聊天信息框中显示用户的离开信息的代码
}
// 如果是出错信息,则从弹出对话框中显示该错误信息
// 弹出对话框使用MessageBox.Show方法
if (cmd == \" ER \" )
{
// 这里填写显示出错信息的代码
}
}
}
}
}
// 发送消息的事件处理
private void btnSend_Click( object sender, System.EventArgs e)
{
// 发送消息的事件。
// 这里需要判断是否私聊
// 普通聊天信息的格式为:*(0/1)nickname_from nickname_to msg
// 具体参考实验指导
Byte[] recMsg = new Byte[buffsize]; // 用于容纳发送数据的数组
string Msg; // 普通聊天信息的字符串
if (chkSecret.Checked)
{
Msg = _____________________________________________________________;
}
else
Msg = _____________________________________________________________;
recMsg = System.Text.Encoding.BigEndianUnicode.GetBytes(Msg.ToCharArray());
________________________________________; // 发送数据
}
// 主界面初始化
private void ClientForm_Load( object sender, System.EventArgs e)
{
// 主界面初始化,需要将聊天信息框、
// 用户列表框和聊天对象下拉框的信息清空。
// 并将“所有人”这个聊天对象加入到聊天对象下拉框中
// 并将其选中。
// 这里开始填写初始化代码
//
// 请填写相关代码
//
// 定义接收线程
recThread = new Thread( new ThreadStart(rec));
}
// 连接服务器
private void btnConnect_Click( object sender, System.EventArgs e)
{
// 连接服务器
// 请进行必要的判断,比如昵称是否为空等
// 这里开始填写连接服务器的代码:
//
// 请填写相关代码
//
if (sock.Connected)
{
// 登录以后把自己的昵称发送给服务器
// 发送昵称的信令为:@NN Nickname
Byte[] recMsg = new Byte[buffsize]; // 容纳信令的字节数组
string cmd; // 信令字符串
cmd = ________________________________________________________;
recMsg = System.Text.Encoding.BigEndianUnicode.GetBytes(cmd.ToCharArray());
________________________________________________; // 发送信令
________________________; // 将昵称输入框的Enable属性改为False,禁止用户修改昵称
// 初始化接收线程,并发起该线程
Thread recThread = new Thread( new ThreadStart(rec));
recThread.Start();
}
}
// 断开连接代码
private void tbnDisconnect_Click( object sender, System.EventArgs e)
{
// 断开连接代码
if (sock.Connected)
{
Byte[] recMsg = new Byte[buffsize]; // 容纳信令的字节数组
string cmd; // 信令字符串
cmd = ________________________________________________________;
recMsg = System.Text.Encoding.BigEndianUnicode.GetBytes(cmd.ToCharArray());
________________________________________________; // 发送信令
// 开始关闭套接字
//
// 请填写相关代码
//
// 清空各个用户列表和聊天对象列表
//
// 请填写相关代码
//
// 将昵称输入框的Enable属性改为True,以便下一次连接
_____________________________;
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容