C#基于TCP协议网络聊天程序.docx_第1页
C#基于TCP协议网络聊天程序.docx_第2页
C#基于TCP协议网络聊天程序.docx_第3页
C#基于TCP协议网络聊天程序.docx_第4页
C#基于TCP协议网络聊天程序.docx_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

郑州轻工业学院网 络 高 级 编 程实 训 报 告实训名称: 基于TCP协议的网络聊天程序 姓 名 学 号 班 级 指导教师 实训地点 日 期 l实训一l.l实训目的:通过开发一款网络聊天程序, 熟练掌握多线程编程技术和TCP应用编程技术。通过本实训, 达到如下目标:1)理解委托的概念, 掌握线程之间通过委托与控件交互的方法。2)理解异常处理的机制,掌握异常处理语句的用法。3)理解线程的概念, 掌握多线程编程的一般方法。4)掌握基于TCP的应用编程技术 。l.2实训题目: 使用c#编程语言, 开发一款网络聊天程序, 玩家通过客户端登陆远程的服务器, 登陆成功后可以与其他在线的玩家通信, 如下图所示。1.3程序基本功能描述如下:1) 当服务器开启服务后, 允许任何一个玩家通过客户端登陆服务器。2) 每当有玩家登录或退出时, 每一个在线的玩家都会刷新玩家列表。3) 当玩家登陆成功后, 可以通过服务器端与任何一个在线的玩家聊天1.4 需求分析:网络聊天程序的系统结构图如下所示 。服务器端客户端通信接口用户接口 用户用户集合管理员玩家用户接口 定义数据字典如下:1)用户(User):在网络聊天程序中,用户是已登陆的玩家。用户具有玩家的用户名、 客户端与服务器之间建立的 Tc连接等属性 。 在程序中, 用户负责向服务器发送和接收数据。2)用户集合(UserList):在网络聊天程序中,用户集合是所有已经登陆服务器的玩家的列表 。 用户集合包含所有已登陆的玩家的用户名和 TcP连接等信息。在程序中,用户集合负责添加、删除用户, 以及向客户端发送和接收数据。1.5 设计说明:1.5.1 界面设计:服务器端:客户端:1.5.2 功能设计:根据需求分析可知, 管理员可以启动停止服务器; 玩家可以登陆服务器; 登录后的玩家可以与其它在线的玩家聊天; 在线玩家关闭客户端即退出登录。客户端发送给服务器端的命令有如下3种: 1)1ogin,用户名:玩家请求登陆服务器。玩家点击“登陆按钮后, 就会发送1ogin命令, 其中的用户名就是请求登陆玩家的用户名 。2)1ogout,用户名: 玩家请求退出服务器。 玩家关闭客户端的主窗体后, 就会发送1ogout命令, 其中的用户名就是请求退出玩家的用户名 。3)talk,用户名1 ,用户名2,信息: 玩家发出聊天信息 。 玩家点击 “发送按钮后,就会发送talk命令,其中的用户名1是发出信息的玩家, 用户名2是接收信息的玩家 。服务器端发送给客户端的命令有如下4种:1)1ogin,用户名:服务器接受到1ogin命令后,检査用户集合,如果没有重名的在线用户,则给所有用户发送1ogin命令,通知玩家更新用户列表。2)sorry:服务器接受到1ogin命令后,检査用户集合,如果发现有重名的在线用户, 就会向新登陆的用户发送sorry命令拒绝登陆。3)1ogout,用户名: 服务器接收到1ogout命令后, 向所有在线用户发送1ogout命令, 通知其他玩家更新用户列表 。4)talk,用户名1 ,用户名2,信息: 服务器接收到talk命令后, 先给用户2发送talk命令; 发送成功后, 再给用户1发送talk命令, 通知用户1 , 聊天信息发送成功。1.6 源代码:1)服务器端代码如下: User类:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net.NetworkInformation;using System.Net;using System.Net.Sockets;using System.Threading;using System.IO;namespace _541307110117TalkServer public class User public string userName; public TcpClient client; public BinaryReader br; public BinaryWriter bw; public User(TcpClient client) this.client = client; NetworkStream ns = client.GetStream(); br = new BinaryReader(ns); bw = new BinaryWriter(ns); public void Close() br.Close(); bw.Close(); client.Close(); public void Send(string message) try bw.Write(message); bw.Flush(); catch (Exception ex) throw ex; public string Receive() try return br.ReadString(); catch (Exception ex) throw ex; UserList类:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace _541307110117TalkServer public class UserList public List list; public UserList() list = new List(); public void AddUser(User user) list.Add(user); public void RemoveUser(User user) user.Close(); list.Remove(user ); public void RemoveAllUsers() for (int i = list.Count - 1; i = 0; i-) RemoveUser(listi); /user是登录或退出的用户 public void SendToAllUsers(User user, string message) string splitStrings = message.Split(,); if (splitStrings0 = login) foreach (User u in list) u.Send(message); if (u.userName != splitStrings1) user.Send(login, + u.userName); else foreach (User u in list) if (u.userName != splitStrings1) u.Send(message); Mainwondow界面代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Net.Sockets;using System.Net;using System.Threading;namespace _TalkServer / / MainWindow.xaml 的交互逻辑 / public partial class MainWindow : Window public MainWindow() InitializeComponent(); listener = new TcpListener(IPAddress.Parse(),port); userList = new UserList(); isStopped = true; public TcpListener listener; public UserList userList; public const int port = 8888; public bool isStopped; private void buttonStart_Click(object sender, RoutedEventArgs e) try listener.Start(); isStopped = false; Task.Run() = ListenConnect(); buttonStart.IsEnabled = false; buttonStop.IsEnabled = true; catch MessageBox.Show(port+端口已占用!); public void ListenConnect() while (!isStopped) TcpClient client; try client = listener.AcceptTcpClient(); catch break; User newUser = new User(client); userList.AddUser(newUser); Task.Run()=Receive(newUser); public void Receive(User user) while (!isStopped) string message = null; try message = user.Receive(); catch userList.SendToAllUsers(user,logout,+user.userName); userList.RemoveUser(user); break; string splitStrings = message.Split(,); switch (splitStrings0) case login: bool isLeagle = true; string name = splitStrings1; foreach (User u in userList.list) if (u.userName = name) isLeagle = false; break; if (isLeagle) user.userName = name; userList.SendToAllUsers(user, message); else user.Send(sorry); userList.RemoveUser(user); break; casetalk: string receiver = splitStrings2; foreach (User u in userList.list) if (u.userName = receiver) u.Send(message); user.Send(message); break; caselogout: userList.SendToAllUsers(user,message); userList.RemoveUser(user); break; private void buttonStop_Click(object sender, RoutedEventArgs e) userList.RemoveAllUsers(); isStopped = true; listener.Stop(); buttonStart.IsEnabled = true; buttonStop.IsEnabled = false; private void Window_Closing_1(object sender, System.ComponentModel.CancelEventArgs e) userList.RemoveAllUsers(); isStopped = true; listener.Stop(); 2)客户端代码如下:User类:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.IO;using System.Net.Sockets;namespace _TalkClient public class User public string userName; public TcpClient client; public BinaryReader br; public BinaryWriter bw; public User(TcpClient client) this.client = client; NetworkStream ns = client.GetStream(); br = new BinaryReader(ns); bw = new BinaryWriter(ns); public void Close() if (br != null) br.Close(); if (bw != null) bw.Close(); if (client != null) client.Close(); public void Send(string message) try bw.Write(message); bw.Flush(); catch(Exception ex) throw ex; public string Receive() try return br.ReadString(); catch(Exception ex) throw ex; Mainwondow界面代码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows;using System.Windows.Controls;using System.Windows.Data;using System.Windows.Documents;using System.Windows.Input;using System.Windows.Media;using System.Windows.Media.Imaging;using System.Windows.Navigation;using System.Windows.Shapes;using System.Net.Sockets;using System.IO;using System.Media;namespace _TalkClient / / MainWindow.xaml 的交互逻辑 / public partial class MainWindow : Window public MainWindow() InitializeComponent(); isConnected=false; public User user; public const int port=8888; public bool isConnected; private void buttonLogin_Click(object sender, RoutedEventArgs e) if (textBoxUserName.Text = ) listBoxHistory.Items.Add(请输入用户名!); return; try TcpClient client = new TcpClient(); client.Connect(, port); user = new User(client); user.userName = textBoxUserName.Text; listBoxHistory.Items.Add(连接成功!); SoundPlayer sndplayer= new SoundPlayer(); sndplayer.SoundLocation = D:DocumentsVisual Studio 2012Projects541307110117TalkClient541307110117TalkClientsongsQQ.wav; sndplayer.Load(); sndplayer.Play(); isConnected = true; SendMessage(login, + user.userName); Task.Run() = Receive(); buttonLogin.IsEnabled = false; buttonSend.IsEnabled = true; catch listBoxHistory.Items.Add(连接失败!); public void Receive() string message; while (isConnected) try message = user.Receive(); catch MessageBox.Show(断开连接!); DelUserOnline(user.userName,true); isConnected = false; buttonLogin.Dispatcher.Invoke()=buttonLogin.IsEnabled=true); buttonSend.Dispatcher.Invoke() = buttonSend.IsEnabled = false); break; string splitStrings = message.Split(,); switch (splitStrings0) case login: if (splitStrings1 = user.userName) AddTalkMessage(登录成功!); else AddUserOnline(splitStrings1); break; casesorry: AddTalkMessage(该用户已被使用!); user.Close(); break; case talk: if (splitStrings1 = user.userName) AddTalkMessage(我对 + splitStrings2 + 说: + splitStrings3); else AddTalkMessage(splitStrings1+对我说:+splitStrings3); break; caselogout: DelUserOnline(splitStrings1,false); break; public void SendMessage(string message) try user.Send(message); catch AddTalkMessage(发送失败!); private void AddTalkMessage(string message) listBoxHistory.Dispatcher.Invoke() = listBoxHistory.Items.Add(message); private void AddUserOnline(string name) listBoxUsers.Dispatcher.Invoke() = listBoxUsers.Items.Add(name); private void DelUserOnline(string name, bool all) listBoxUsers.Dispatcher.Invoke() = if (all) listBoxUsers.Items.Clear(); else listBoxUsers.Items.Remove(name); ); private void buttonSend_Click(object sender, RoutedEventArgs e) if (textBoxMessage.Text = ) AddTalkMessage(请输入对话信息!); return; if (listBoxUsers.SelectedIndex = -1) AddTalkMessage(请选择用户!); return; string receiver = listBoxUsers.SelectedItem.ToString(); SendMessage(talk,+user.userName+,+receiver+,+textBoxMessage.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论