实验六 即时通信系统.doc
文本预览下载声明
实验六 即时通信系统
1.实验目的
(1)练习TcpClient和TcpListener的用法。
(2)练习NetworkStream的用法。
(3)练习StreamReadr和StreamWriter的用法。
(4)练习线程的创建和使用方法。
(5)练习解决TCP协议消息边界问题的另一种方法。
2.建议用时
建议用4-6小时完成本实验,或者根据自己的理解情况调整实际需要的时间。
3.实验内容
开发一个简单的基于TCP的即时通信系统,服务器端和客户端设计界面分别如下图所示。
功能要求:
(1)任何一个客户端,均可以与服务器进行通信。
(2)服务器要能显示客户端连接的状态,当客户端连接成功后,要自动及时告知客户端已经连接成功的信息。
(3)客户端和服务器建立连接后,即可以和服务器聊天,也可以和其他任何客户聊天,用StreamReader和StreamWriter对象实现字符串的接收和发送。
(4)不论客户端何时退出程序,服务器都要做出正确判断,并显示该客户连接和断开连接的情况。
4.实验要求
(1)使用强类型的List泛型列表userList保存连接的用户。
(2)定义委托解决一个线程调用另一个线程控件的问题。
5.实验步骤提示
服务器端:
(1)创建一个名为SyncChatServer的Windows应用程序,将Form1.cs换名为MainForm.cs,设计界面如图1-2所示。
(2)在解决方案资源管理器中,鼠标右键单击项目名,选择【添加】(【类】,添加一个类文件User.cs,用于保存与客户通信需要的信息。参考代码如下。
class User
{
public TcpClient client{ get; private set; }
public StreamReader sr{ get; private set; }
public StreamWriter sw { get; private set; }
public User(TcpClient client)
{
this.client = client;
NetworkStream netStream = client.GetStream();
sr = new StreamReader(netStream, System.Text.Encoding.UTF8);
sw = new StreamWriter(netStream, System.Text.Encoding.UTF8);
}
public void Close()
{
sr.Close();
sw.Close();
client.Close();
}
}
(3)在SyncChatServer中添加对应的代码和事件。代码如下。
public partial class MainForm : Form
{
/// summary保存连接的所有用户/summary
private ListUser userList = new ListUser();
/// summary使用的本机IP地址/summary
IPAddress localAddress;
/// summary监听端口/summary
private const int port = 51888;
private TcpListener myListener;
/// summary是否正常退出所有接收线程/summary
bool isNormalExit = false;
public MainForm()
{
InitializeComponent();
listBoxStatus.HorizontalScrollbar = true;
IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());
localAddress = addrIP[0];
buttonStop.Enabled = false;
}
/// summary【开始监听】按钮的Click事件/summary
private void buttonStart_Click(object sender, EventArgs e)
{
myListener = new TcpListener(loc
显示全部