版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、郑州轻工业学院网 络 高 级 编 程实 训 报 告实训名称:基于 tcp协议的网络聊天程序姓名学号班级指导教师实训地点日期l 实训一l.l实训目的:通过开发一款网络聊天程序, 熟练掌握多线程编程技术和tcp应用编程技术。通过本实训 , 达到如下目标 : 1) 理解委托的概念 , 掌握线程之间通过委托与控件交互的方法。2) 理解异常处理的机制, 掌握异常处理语句的用法。3) 理解线程的概念 , 掌握多线程编程的一般方法。4) 掌握基于 tcp 的应用编程技术。l.2 实训题目:使用c#编程语言 , 开发一款网络聊天程序, 玩家通过客户端登陆远程的服务器 , 登陆成功后可以与其他在线的玩家通信,
2、如下图所示。客户端服务器端1.3 程序基本功能描述如下:1) 当服务器开启服务后, 允许任何一个玩家通过客户端登陆服务器。2) 每当有玩家登录或退出时, 每一个在线的玩家都会刷新玩家列表。3) 当玩家登陆成功后, 可以通过服务器端与任何一个在线的玩家聊天1.4 需求分析:网络聊天程序的系统结构图如下所示。用户接口定义数据字典如下: 1) 用户(user):在网络聊天程序中, 用户是已登陆的玩家。用户具有玩家的用户名、客户端与服务器之间建立的 tc 连接等属性。 在程序中 , 用户负责向服务器发送和接收数据。2) 用户集合 (userlist):在网络聊天程序中, 用户集合是所有已经登陆服务器的
3、玩家的列表。 用户集合包含所有已登陆的玩家的用户名和 tcp 连接等信息。在程序中,用户集合负责添加、删除用户, 以及向客户端发送和接收数据。1.5 设计说明:1.5.1 界面设计:服务器端:玩家用户用户集合管理员通信接口用户接口客户端:1.5.2 功能设计:根据需求分析可知 , 管理员可以启动停止服务器; 玩家可以登陆服务器 ; 登录后的玩家可以与其它在线的玩家聊天; 在线玩家关闭客户端即退出登录。客户端发送给服务器端的命令有如下3种:1)1ogin, 用户名 : 玩家请求登陆服务器。玩家点击“登陆 按钮后 , 就会发送1ogin 命令, 其中的用户名就是请求登陆玩家的用户名。2) 1ogo
4、ut, 用户名 : 玩家请求退出服务器。玩家关闭客户端的主窗体后, 就会发送 1ogout命令, 其中的用户名就是请求退出玩家的用户名。3)talk,用户名 1 , 用户名 2, 信息: 玩家发出聊天信息。 玩家点击“发送 按钮后 , 就会发送 talk 命令, 其中的用户名 1是发出信息的玩家 , 用户名 2是接收信息的玩家。服务器端发送给客户端的命令有如下4种:1)1ogin, 用户名 : 服务器接受到 1ogin 命令后 , 检査用户集合 , 如果没有重名的在线用户 , 则给所有用户发送 1ogin 命令, 通知玩家更新用户列表。2)sorry: 服务器接受到 1ogin 命令后 , 检
5、査用户集合 , 如果发现有重名的在线用户, 就会向新登陆的用户发送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 syste
6、m.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 publicclassuser publicstring username; publictcpclient client; publicbinaryreader br; p
7、ublicbinarywriter bw; public user( tcpclient client) this .client = client; networkstream ns = client.getstream(); br = new binaryreader (ns); bw = new binarywriter(ns); publicvoid close() br.close(); bw.close(); client.close(); publicvoid send( string message) try bw.write(message); bw.flush(); cat
8、ch ( exception ex) throw ex; publicstring 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 publicclassuserlist publicli
9、st list; public userlist() list = new list (); publicvoid adduser( user user) list.add(user); publicvoid removeuser(user user) user.close(); list.remove(user ); publicvoid removeallusers() for ( int i = list.count - 1; i = 0; i-) removeuser(listi); /user 是登录或退出的用户publicvoid sendtoallusers(user user,
10、 stringmessage) 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
11、; 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.i
12、maging; using system.windows.navigation; using system.windows.shapes; using system.net.sockets; using system.net; using system.threading; namespace _talkserver / mainwindow.xaml 的交互逻辑/publicpartialclassmainwindow : window public mainwindow() initializecomponent(); listener = newtcplistener( ipaddres
13、s .parse( ),port); userlist = new userlist (); isstopped = true ; publictcplistener listener; publicuserlist userlist; publicconstint port = 8888; publicbool isstopped; privatevoid buttonstart_click(object sender, routedeventargs e) try listener.start(); isstopped = false ; task.run() = lis
14、tenconnect(); buttonstart.isenabled = false ; buttonstop.isenabled = true ; catch messagebox .show(port+ 端口已占用! ); publicvoid listenconnect() while (!isstopped) tcpclient client; try client = listener.accepttcpclient(); catch break ; user newuser = new user(client); userlist.adduser(newuser); task.r
15、un()=receive(newuser); publicvoid 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
16、 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 = splits
17、trings2; 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 ; privatevoid buttonstop_click(object sender, routedeventargs e) userlist.removeallusers(); isstopped
18、 = true ; listener.stop(); buttonstart.isenabled = true ; buttonstop.isenabled = false ; privatevoid window_closing_1( object sender, system.componentmodel. canceleventargs e) userlist.removeallusers(); isstopped = true ; listener.stop(); 2)客户端代码如下:user类:using system; using system.collections.generi
19、c; using system.linq; using system.text; using system.threading.tasks; using system.net; using system.io; using system.net.sockets; namespace _talkclient publicclassuser publicstring username; publictcpclient client; publicbinaryreader br; publicbinarywriter bw; public user( tcpclient client) this .
20、client = client; networkstream ns = client.getstream(); br = new binaryreader (ns); bw = new binarywriter(ns); publicvoid close() if (br != null ) br.close(); if (bw != null ) bw.close(); if (client != null ) client.close(); publicvoid send( string message) try bw.write(message); bw.flush(); catch (
21、 exception ex) throw ex; publicstring 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 s
22、ystem.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 / mainwin
23、dow.xaml 的交互逻辑/publicpartialclassmainwindow : window public mainwindow() initializecomponent(); isconnected=false ; publicuser user; publicconstint port=8888; publicbool isconnected; privatevoid buttonlogin_click(object sender, routedeventargs e) if (textboxusername.text = ) listboxhistory.items.add
24、(请输入用户名! ); return ; try tcpclient client = new tcpclient (); client.connect(, port); user = new user(client); user.username = textboxusername.text; listboxhistory.items.add(连接成功! ); soundplayer sndplayer= newsoundplayer (); sndplayer.soundlocation = d:documentsvisual studio 2012projects541
25、307110117talkclient541307110117talkclientsongsqq.wav; sndplayer.load(); sndplayer.play(); isconnected = true ; sendmessage(login, + user.username); task.run() = receive(); buttonlogin.isenabled = false ; buttonsend.isenabled = true ; catch listboxhistory.items.add(连接失败! ); publicvoid receive() strin
26、g 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 splitst
27、rings = 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
28、 + 说: + splitstrings3); else addtalkmessage(splitstrings1+对我说:+splitstrings3); break ; caselogout: deluseronline(splitstrings1,false ); break ; publicvoid sendmessage(string message) try user.send(message); catch addtalkmessage(发送失败! ); privatevoid addtalkmessage( string message) listboxhistory.disp
29、atcher.invoke() = listboxhistory.items.add(message); privatevoid adduseronline(string name) listboxusers.dispatcher.invoke() = listboxusers.items.add(name); privatevoid deluseronline(stringname, bool all) listboxusers.dispatcher.invoke() = if (all) listboxusers.items.clear(); else listboxusers.items
30、.remove(name); ); privatevoid 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.text);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年嘉峪关市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(b卷)
- 2026年东莞市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(完整版)
- 承德市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(历年真题)
- 河池市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(培优b卷)
- 2026年肇庆市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(全优)
- 三明市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及完整答案详解一套
- 乐山市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(各地真题)
- 湘西土家族苗族自治州农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(轻巧夺冠)
- 2025年高校学生资助政策测试题及答案
- 秦皇岛市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)含答案详解(a卷)
- 压铸品质培训课件文案
- 模具制造工艺(第三版) 课件 项目三锻模零件机械加工工艺
- 桌游介绍课件
- 税务征管文书课件
- GCP质量控制培训课件
- 中通快递运营管理制度
- 生猪屠宰兽医卫生检验人员理论考试题及答案
- BIM在施工成本控制中的作用分析
- 国家开放大学《监督学》形考任务( 1-4)试题和答案解析
- 冲压车间考勤管理制度
- 2025年上海市公务员录用考试《行测》A类真题及答案解析(回忆版)
评论
0/150
提交评论