您的当前位置:首页正文

聊天室程序

来源:化拓教育网


实验二:聊天室的开发

实验目的:

• 学习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,以便下一次连接

_____________________________;

}

}

因篇幅问题不能全部显示,请点此查看更多更全内容