ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:1.06MB ,
资源ID:3882222      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3882222.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机网络实习报告.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

计算机网络实习报告.docx

1、计算机网络实习报告福建农林大学计算机与信息学院信息工程类课程实习报告课程名称:计算机网络实习题目:TCP通信程序的设计姓 名:陈富强系:计算机系专 业:计算机科学与技术年 级:2009级学 号:091150011指导教师:周术诚职 称:教授2012 年 5 月 11 日福建农林大学计算机与信息学院信息工程类课程实习报告结果评定评语:成绩:指导教师签字:评定日期:目录实习的目的和任务 3实习要求 3实习地点 3主要仪器设备(实验用的软硬件环境) 3实习内容 3客户端通讯核心 3定义自己的数据包 3客户端套接字类 6服务器通讯核心类 9服务器配置 9用户管理 10日志管理 11服务器管理 14服务

2、器通讯核心 15客户端和服务器的通讯 16问题讨论与分析 17结束语 19TCP通信程序的设计1. 实习的目的和任务掌握java语言TCP/IP通讯程序的设计2. 实习要求使用TCP/IP协议实现一个客户端和服务器通讯软件,多个客户端可以通过服务器实现单聊和群聊,也可以通过服务器获取公告信息,在线用户列表,以及修改密码。服务器可以查看日志文件,查看当前在线用户和修改用户的信息,可以对客户端发送公告,强制用户退出等功能。3. 实习地点福建农林大学4. 主要仪器设备(实验用的软硬件环境)Windows7操作系统。TCP/IP协议编程工具:MyEclipse105. 实习内容51 客户端通讯核心5.

3、1.1 定义自己的数据包客户端通讯时候必须有一个套接字socket来与服务器进行数据交流。这里的数据的格式,我自己编写了一个类DatePackage,并且它实现了可序列化,只有服务器与客户端同时拥有这个类才能进行发送包的解析与取得参数,才能知道这个数据包是要做什么。public class DatePackage implements Serializable /* * */ private static final long serialVersionUID = -3425205872711934961L; /* * 登录 */ public static final int LOGIN =

4、 10; /* * 登录响应 */ public static final int LOGIN_REPLAY = 11; /* * 获取公告 */ public static final int GETPUB = 20; /* * 获取公告响应 */ public static final int GETPUB_REPLAY = 21; /* * 获取在线用户 */ public static final int GETLIST = 30; /* * 获取在线用户响应 */ public static final int GETLIST_REPLAY = 31; /* * 聊天 */ publ

5、ic static final int CHAT = 40; /* * 聊天响应 */ public static final int CHAT_REPLAY = 41; /* * 修改密码 */ public static final int CHANGEPW = 51; /* * 修改密码响应 */ public static final int CHANGEPW_REPLAY = 52; private int doWhat; private Map params = new HashMap(); /* * 获取数据包要做什么 * return 做什么 */ public int get

6、DoWhat() return doWhat; /* * 设置数据包要做什么 * param doWhat 做什么 */ public void setDoWhat(int doWhat) this.doWhat = doWhat; /* * 获取数据包参数 * param name 参数名字 * return 参数的值 */ public Object getParams(String name) return params.get(name); /* * 设置数据包参数 * param name 参数名字 * param value 参数值 */ public void setParams

7、(String name, Object value) params.put(name, value); 当要通过TCP/IP协议发送一个数据包给服务器时,必须定义这个数据包是做什么,通过传入静态整形共有变量可以轻松知道这个数据包是做什么的。如要登录则传入CHAT这个整型变量。各个变量都有注释说明是做什么的这里就不再赘述了。除了要让服务器或客户端知道要这个数据包是要做什么的之外还要传入一些额外的参数,例如LONGIN登录这个操作需要传入账户和密码这两个参数,这个时候就可以把参数放到Map params里面一起传过去就可以了。当然事先要先知道里面会有那些参数,服务器或客户端才能将其正确的取出来。

8、5.1.2 客户端套接字类当客户点击客户端的登录窗口时候,套接字就开始建立了。这个时候他会通过输入窗口中获取目的主机的ip地址和端口号。建立的同时还建立了输入流和输出流。这里使用的对象输入字节流和对象输出字节流,而需要输出和输入的对象正是刚刚上面定义的数据包。JAVA中规定要输出对象和识别一个对象,这个对象必须实现序列化接口。 登录时候将创建一个数据包,这个数据包含有用户名密码等信息,然后发送给服务器,同时客户端通讯核心类会启动一个线程不断的监听从服务器传来的数据包并进行解析。若登录成功,服务器穿来的数据包应该包含登录状态,若为success则把客户端的登录窗口切换为聊天窗口登录窗口和聊天窗口

9、分布如下:如上面所示,在创建聊天窗口的同时还需要同时获得在线用户列表和公告,这个原理和登录的时候是一样的,只要在创建聊天窗口的时候发送两个数据包,一个数据包是获得公告,一个是获得在线列表,同时接收服务器发来的回应包,从回应包里面取得自己需要的数据,并分别在聊天窗口相应的部分显示出来。聊天公告很简单,取出来的就是一串从服务器发来的字符串。而在线用户列表则是通过LIST来实现的,LIST里面装的是自己定义的USER类,这个类同数据包类一样,都需要实现可序列化,并且服务器应该也有一个同他一模一样的类。USER类是对用户信息的封装,用户所有的信息都在USER类中。或许在线用户列表也可以用字符串来实现,

10、但是考虑到后面还有一些功能可能需要使用到在线用户的各种信息,所有使用USER类来实现会比较好,是软件的可拓展性提升。修改密码这个功能也是通过向服务器发数据包来实现的。当然如果很多人同时修改密码可能会造成服务器负担太重,而导致回应包的延迟从而使得用户进入等待的时间也增加了。通过套接字的对象输出字节流发送修改密码的数据包应该包含用户的原密码和要修改的密码,重复输入密码的验证应该放到客户端进行,否则服务器负担会更加沉重。所以能放到客户端进行的操作尽量放到客户端进行。聊天这个操作分为群聊和单聊,所以现在客户端判断好是单聊还是群聊再通过额外信息加入到数据包发给服务器。判断单聊还是群聊需要在在线用户列表里

11、面加个事件监听,当鼠标点击某个对象的时候,只要判断当前点击的这个对象是否为USER的一个实例就可以判断单聊还是群聊。因为所有人是一个字符串不是USER对象,而其他人就是USER的对象。另外,自己是不能跟自己聊天的,所以在判断的时候还要判断当前这个对象是否就是自己。在客户端通讯核心类中有个USER成员变量,这个变量保存的就是客户端这个客户的所有信息。当然这个信息在登录的时候由服务器传过来的。所有整个客户端与服务器的通讯都是通过套接字SOCKET的对象输入流和对象输出流来实现的,而SOCKET又是基于TCP/IP实现的,这里的数据包可以理解为自己定义的通讯协议,只有服务器和客户端的数据包类是一致的

12、才能让服务器解析你的数据包是什么意思并作出相应的解答和回应。回应的还是方法还是通过传输这个数据包,只不过里面的信息已经换成客户端需要的信息了。通讯核心类的方法如下(聊天登录窗口和聊天界面的代码就不附上了):Public getUser(); /获取当前用户的User类Public setUser(User) /设置当前用户的User类Public OICQ_ClientNet(String,int)/构造方法,创建SOCKETProtect class Recv /线程类,用于不断的接受从服务器发来的数据包并解析处理 Public process(DatePackage) /处理数据包 Pub

13、lic processChangePw(DatePackage) /处理修改密码 Public processChatReplay(DatePackage) /处理聊天响应包 Public processLoginReplay(DatePackage) /处理登录响应包 Public processGetPubReplay(DatePackage) /处理获取公告 Public processGetListReplay(DatePackage) /处理获取在线用户列表Public sent(DatePackage) /发送数据包Public login(DatePackage) /登录Publ

14、ic close() /关闭套接字连接和各种资源Public GetPub() /获取公告Public GetList() /获取在线用户列表Public Chat() /聊天5.2 服务器通讯核心类5.2.1 服务器配置服务器配置窗口需要填入各种参数才能登录服务器,如连接oracle的连接和用户名,密码,驱动,端口等信息,如果正确无误后按进入服务器按钮进入服务器。5.2.2 用户管理聊天系统采用的是Oracle数据库,当然也可以根据以后的情况来改变,因为所以的参数都是通过配置文件来设置和使用的。在用户管理中可以通过点击查询按钮来查询用户的信息,还可以通过添加新的用户按钮添加新用户,修改密码,

15、修改所有人密码,删除用户等操作。这些操作有一个共同的特征,就是访问数据库并且做一些增删改查的操作。所以可以专门写一个类来实现这些与数据库打交道的方法,于是我写了UserDao这个类。这个类先从另外一个专门获得连接数据库的connection中获得其所必须的connection然后进行各种增删改查操作。只有选择一个用户,修改用户,删除用户和重置密码才能使用,这个还是通过监听Table类来实现。并且不能对在线用户进行删除和重置密码等操作。截图如下:5.2.3 日志管理当有用户登录和下线时候,当服务器启动和关闭时候都需要进行写入日志操作。同样专门写一个类来实现这个操作,这个类的方法如下:/* * 日

16、志管理类 * author Slo * */public class Log private String folder = log; private DateFormat fileNameFormat = new SimpleDateFormat(yyyy-MM-dd); private DateFormat logDateFormat = new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); /* * 构造方法 */ public Log() File f = new File(folder); if(!f.exists() f.mkdir(); /* *

17、写一条日志 * param date 日期 * param content 内容 */ public void writeLog(Date date, String content) FileWriter fw = null; File f = new File(folder + / + fileNameFormat.format(date) + .log); try f.createNewFile(); fw = new FileWriter(f, true); fw.write( + logDateFormat.format(date) + : + content); fw.write(r

18、n); fw.flush(); catch (IOException e) e.printStackTrace(); finally try if(fw != null) fw.close(); catch (IOException e) e.printStackTrace(); /* * 读一条日子 * param date 日期 * param keyWord 关键字 * return 内容 */ public List readLog(Date date, String keyWord) File f = new File(folder + / + fileNameFormat.form

19、at(date) + .log); BufferedReader bf = null; List list = new ArrayList(); try bf = new BufferedReader(new FileReader(f); String s = null; while(s = bf.readLine() != null) if(s.indexOf(keyWord) != -1) list.add(s); catch (FileNotFoundException e) e.printStackTrace(); catch (IOException e) e.printStackT

20、race(); finally try if(bf != null) bf.close(); catch (IOException e) e.printStackTrace(); return list; 截图如下:5.2.4 服务器管理这个界面是可以开启服务器和关闭服务器,并且可以通过选中上面的在线用户来强制用户下线。开启服务时候,通讯核心代码的ServerSocket开始创建并且占用一个端口,不断的接受客户端的连接,每当有一个客户端连接进来就在启动一个专门的线程来为这个客户服务,因此要强制用户下线只需要将用户的socket关闭就可以了,用户的客户端就会出现异常,再进行捕获异常就可以解决了。

21、发送公告,只需要将所有在线用户取出并循环发出公告响应包让客户端收到即可。其界面如下:5.2.5 服务器通讯核心在开启服务器时候,通讯核心类就开始发挥其作用了,可以说,这个类是服务器的灵魂。开启服务器的时候会有一个线程不断的接受远程客户端的请求,当接受到一个请求的时候,他就开启另外一个线程来专门为这个客户服务。这个线程可以响应客户所有的请求并且发送响应包。当然,这个类有一个成员变量,可以记录所有连接上的用户信息,仅仅记录用户的socket即可。用户发出一个数据包,线程就开始分析这个数据包是做什么的并且做出分析和响应,例如一个用户登录上服务器,服务器先验证由客户端发来的账户密码,然后到数据库查询是

22、否有此人,若有则反馈给客户端一个success的数据包,当客户端接收到这个数据包就可以做出对应的响应了。当用户因为意外情况掉线或断开连接时候,只要在服务器里面捕获一个异常就可以了。处理这个异常应该包括把用户的在线状态设置为离线并且发送给所有用户通知他们更新在线用户列表。同时把服务器管理面板在线用户更新。当关闭服务器的时候,要先确认没有人在线才能关闭服务器,并且关闭服务器要把各种资源都关闭掉。包括各种输出流和输入流,还有ServerSocket。若没有关闭完全的话服务器随着开启关闭的次数增多会造成服务器资源匮乏,最后崩溃。5.3 客户端和服务器的通讯客户端: 连接 服务器:Socket服务器内部

23、:6. 问题讨论与分析问题一: 当一个客户端发送完消息后,发第二条的时候,连接就断掉了,而且另外一个客户端也收不到。截图如下:两个客户端相互发送的消息都没有收到。后来发现是服务器的成员变量放错位置了导致输出流和输入流丢失。改正后截图如下:问题二:在没有启动服务的时候,服务器关闭不了。观察代码发现,关闭时候调用了通讯核心的关闭方法,然而在没有开启服务时候通讯核心里面是没有内容的,所以会出现空指针错误。解决的办法就是捕获异常让程序终止。7. 结束语这个程序让我学到了TCP/IP通讯的基本内容,套接字的连接,服务器的响应都是通讯的具体应用。同时我们自己还可以定义自己的通讯协议,如DatePackage类,客户端发送LOGIN则服务器可以响应这个请求,而这个LOGIN就是我们自己定义的。通讯协议在任何地方都占有很重要的低位,特别是C/S模式中。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2