1、实 验 报 告18p实 验 报 告学院(部):理学院 班级:信计1101班 学号:11411100131 姓名:杨宠实验课程C#程序设计实验名称利用同步TCP编写网络聊天程序指导老师江力实验性质(选修、必修)必修实验类型(验证、设计、创新、综合)验证实验课时4课时实验日期、时间2013-9-182013-10-09实验消耗材料PC机实验仪器设备(实验硬件要求)计算机一台,Visual stadio 2010实验目的掌握C#的同步TCP应用编程方法。实验内容(实验原理、可用的理论知识、算法、程序、步骤和方法)一、 实验内容 同步TCP服务器端应用编程与客户端应用编程。二、 实验基本原理 利用Tc
2、pListener类、TcpClient类、Socket类提供的方法进行同步TCP应用编程。三、 注意事项BinaryReader, BinaryWriter类的应用,及TCP类及协议的一些知识运用。四、 实验步骤1、 同步TCP服务器端应用编程:网络聊天服务器;2、 同步TCP客户端应用编程:网络聊天客户端。1.服务器端编程:(1)创建一个名为SyncChatServer的Windows应用程序,将Form1.cs换名为MainForm.cs,设计界面如下图所示:(2)在解决方案资源管理器中,添加一个名为User.cs的文件,用于保存与客户通信需要的信息,代码如下:using System.
3、Net.Sockets;using System.IO;namespace SyncChatServer class User public TcpClient client;/get; private set; public BinaryReader br;/get; private set; public BinaryWriter bw;/get; private set; public string userName;/ get; set; public User(TcpClient client) this.client = client; NetworkStream networkS
4、tream = client.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); public void Close() br.Close(); bw.Close(); client.Close(); (3)在MainForm中添加对应的代码和事件:using System;using System.Collections.Generic;using System.Windows.Forms;/添加的命名空间引用using System.Net;using System
5、.Net.Sockets;using System.Threading;namespace SyncChatServer public partial class MainForm : Form / 保存连接的所有用户 private List userList = new List(); / 使用的本机IP地址 IPAddress localAddress; / 监听端口 private const int port = 51888; private TcpListener myListener; / 是否正常退出所有接收线程 bool isNormalExit = false; publi
6、c MainForm() InitializeComponent(); listBoxStatus.HorizontalScrollbar = true; IPAddress addrIP = Dns.GetHostAddresses(Dns.GetHostName(); localAddress = addrIP0; buttonStop.Enabled = false; / 【开始监听】按钮的Click事件 private void buttonStart_Click(object sender, EventArgs e) myListener = new TcpListener(loca
7、lAddress, port); myListener.Start(); AddItemToListBox(string.Format(开始在0:1监听客户连接, localAddress, port); /创建一个线程监听客户端连接请求 Thread myThread = new Thread(ListenClientConnect); myThread.Start(); buttonStart.Enabled = false; buttonStop.Enabled = true; / 接收客户端连接 private void ListenClientConnect() TcpClient
8、newClient = null; while (true) try newClient = myListener.AcceptTcpClient(); catch /当单击“停止监听”或者退出此窗体时AcceptTcpClient()会产生异常 /因此可以利用此异常退出循环 break; /每接受一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息 User user = new User(newClient); Thread threadReceive = new Thread(ReceiveData); threadReceive.Start(user); userList.A
9、dd(user); AddItemToListBox(string.Format(0进入, newClient.Client.RemoteEndPoint); AddItemToListBox(string.Format(当前连接用户数:0, userList.Count); / / 处理接收的客户端数据 / / 客户端信息 private void ReceiveData(object userState) User user = (User)userState; TcpClient client = user.client; while (isNormalExit = false) str
10、ing receiveString = null; try /从网络流中读出字符串,此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串 receiveString = user.br.ReadString(); catch if (isNormalExit = false) AddItemToListBox(string.Format(与0失去联系,已终止接收该用户信息, client.Client.RemoteEndPoint); RemoveUser(user); break; AddItemToListBox(string.Format(来自0:1, user.client.Cli
11、ent.RemoteEndPoint, receiveString); string splitString = receiveString.Split(,); switch (splitString0) case Login: user.userName = splitString1; SendToAllClient(user, receiveString); break; case Logout: SendToAllClient(user, receiveString); RemoveUser(user); return; case Talk: string talkString = re
12、ceiveString.Substring(splitString0.Length + splitString1.Length + 2); AddItemToListBox(string.Format(0对1说:2, user.userName, splitString1, talkString); SendToClient(user, talk, + user.userName + , + talkString); foreach (User target in userList) if (target.userName = splitString1 & user.userName != s
13、plitString1) SendToClient(target, talk, + user.userName + , + talkString); break; break; default: AddItemToListBox(什么意思啊: + receiveString); break; / / 发送message给user / / 指定发给哪个用户 / 信息内容 private void SendToClient(User user, string message) try /将字符串写入网络流,此方法会自动附加字符串长度前缀 user.bw.Write(message); user.bw.Flush(); AddItemToListBox(string.Format(向0发送:1, user.userName, message); catch AddItemToListBox(string.Format(向0发送信息失败, user.userName); / 发送信息给所有客户/summ
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1