课程设计任务书
2010—2011学年第二学期
专业: 计算机科学与技术 学号: 姓名: 课程设计名称:计算机网络课程设计 设计题目: 网上聊天程序 完成期限:自 2011 年 5 月 26 日至 2011 年 6月 3 日共 1 周
设计目的: 主要完成一个简单的聊天室程序,采用客户/服务器模式。由于服务器只能支持一个客户,实际上是一个点对点通信的程序。客户端程序和服务器程序通过使用流式套接字对象和处理网络事件的方法来交换聊天内容,并在窗口的列表框中显示。 功能要求:程序采用Socket通信机制,使用TCP协议进行通信。将服务端和客
户端集成在一个程序中,客服端用来发送信息,服务端用来接收信息。 一、设计的任务:根据实际情况,进行需求分析和总体规划,建立一个大体的
模型,然后用java编写程序实现预设的功能。 二、进度安排: 序号 1 2 3 阶段内容 布置任务及调研 系统分析与设计 调试及报告撰写 合 计 所需时间 2天 2天 3天 7天 三、主要参考资料: [1] 谢希仁.计算机网络教程.北京: 人民邮电出版社,2006. [2] 耿祥义,张跃平.北京: ,2003.
[3] 方敏,张彤.网络应用程序设计.西安:电子科技大学出版社,2005. [4] 黄超.Windows下的网络编程.北京:人民邮电出版社,2003. 指导教师(签字): 教研室主任(签字): 批准日期: 年 月 日
摘 要
21世纪是一个以网络为核心的信息时代,要实现信息化,就必须依靠完善的网络。各种实时性的聊天娱乐软件也同时诞生,而且为我们的即时通讯带来了众多的方便,比如说大家所熟知的腾讯QQ、微软的MSN、移动的Fetion等,都是做的比较成功的实时聊天工具。随着网络的日益普及,各种聊天工具也层出不穷。本设计即为一款即时的网络通信工具。该设计中我主要编写了该聊天工具的服务器端程序和事件处理类程序,主要使用流式套接技术,运用EventHandle类实现视图界面上的事件的处理,用于用户与程序进行交互,而UdpServer类实现消息的接收,将接收到的消息显示到界面上,实现了点对点的通信。该聊天工具操作简单,方便快捷,满足了简单的通信就要求。
关键词:网络、聊天、流式套接字
目 录
1设计描述 .......................................................... 1 2详细设计 .......................................................... 1
2.1 View类 ................................................................................................................................. 2 2.2 UdpClient类 ......................................................................................................................... 2 2.3 UdpServer类 ........................................................................................................................ 3 2.4 EventHandle类..................................................................................................................... 5 2.5 MainClass类 ........................................................................................................................ 7
3测试试报告 ........................................................ 7 4 测试结果 ......................................................... 7 总 结 ....................................................................................................................... 9 参考文献 ..................................................................................................................... 10
课程设计说明书
1设计描述
本设计是一种基于TCP协议的点对点的聊天工具,此程序主要分为两部分:服务器端和客户端。服务器端用于提供一个网络端口,等待客户端发出请求,登录到此服务端,然后进行网络通讯和消息的转发;客户端可通过服务器端的IP地址发送连接请求,然后登陆聊天室。程序之间采用这样的方式实现互相通信:将服务端和客户端集成在一个程序中,客服端用来发送信息,服务端用来接收信息。服务器端同时作为一个转发站,进行消息的转发。整个程序的主体使用了Socket类的方法,实现了网络通讯聊天。
该程序共设计五个类:View类, EventHandle类,UdpClient类,UdpServer类,MainClass类。
View类实现程序的视图界面。
EventHandle类实现视图界面上的事件的处理,用于用户与程序进行交互。 UdpClient类实现消息的发送,将用户输入的消息发送到指定地址。 UdpServer类实现消息的接收,将接收到的消息显示到界面上。
MainClass类实现总的调用。 各类之间的调用关系如图1.1所示。
MainClass实类化View将接收的消息发应到视图上响应事件处理将发送的消息发应到视图上EventHandle调用服务端接收消息调用客户端发送消息UdpServerUdpClient
图1.1
2详细设计
第 1 页 共 9 页
课程设计说明书
2.1 View类
创建如下的Frame界面
设置TextField f1获取要监听端口,并且加入TextListener监听文本信息。 设置设定按钮为Button b1,添加ActionListener监听按钮是否被激活,默认设置按钮不可按下。
设置TextArea t1用于显示用户发送的消息和接收到的消息,每次都将消息追加的到t1里。
设置TextField f2获取接收方的IP,并且加入TextListener监听文本信息。 设置TextFiled f3获取接收方的端口号,并且加入TextListener监听文本信息。 设置TextArea t2获取用户发送的消息,并且加入TextListener监听文本信息。 设置Button b2, 添加ActionListener监听按钮是否被激活,默认设置按钮不可按下。
2.2 UdpClient类
实现线程接口,每次发送消息都启动一个发送线程通过构造函数传入发送方的IP,端口号,发送消息。具体代码如下: public class UdpClient implements Runnable { private String usIP;//接收方IP private int usPort;//接收方端口号 private String sendMsg;//发送的消息
private DatagramSocket socket;//socket端点
第 2 页 共 9 页
课程设计说明书
private DatagramPacket packet;//构造的发送数据报
public UdpClient(String usIP,int usPort, String sendMsg) {//构造函数 this.usIP = usIP;//传进IP
this.usPort = usPort;//传进端口号
this.sendMsg = sendMsg;//传进发送的消息 }
public void run() {//发送线程 byte [] buf = new byte[256]; buf = sendMsg.getBytes(); try { socket = new DatagramSocket(); packet = new
DatagramPacket(buf,buf.length,InetAddress.getByName(usIP),usPort); socket.send(packet); socket.close();
} catch (SocketException e) { JOptionPane.showMessageDialog(null,\"SocketExcetion in UdpCllient!\"); } catch (UnknownHostException e) { JOptionPane.showMessageDialog(null,\"UnkownHostException in UdpClient\"); //e.printStackTrace(); } catch (IOException e) { //e.printStackTrace(); JOptionPane.showMessageDialog(null,\"IOException in UdpClient!\"); } } }
2.3 UdpServer类
实现Runnable接口,启动一个监听端口的线程(服务端),当接收的消息为空时,其中的RunID置为flase,服务端即退出监听。另外设置一个静态的int变量isRun判断当前的服务端是否在监听某个端口,值为0表示没有监听,值为1表示正在监听,为给服务端发送一个退出消息提供辅助。具体代码如下:
public class UdpServer implements Runnable { public static int ucPort;//监听的端口号 private String receiveMsg;//接收到的消息 private DatagramSocket socket; //socket端点
private DatagramPacket packet; //构造接收数据报 private boolean RunID = true;//服务端退出控制辅助
public static int isRun = 0;//向服务端发送退出消息的辅助
第 3 页 共 9 页
课程设计说明书
public UdpServer(int ucPort,int isRun) {
this.ucPort = ucPort;//传进监听的端口号
this.isRun = isRun;//向服务端发送退出消息的辅助 }
public void run() { try { socket = new DatagramSocket(ucPort); while(RunID) { byte [] buf = new byte[256]; packet = new DatagramPacket(buf,buf.length); socket.receive(packet); receiveMsg = new
String(packet.getData(),packet.getOffset(),packet.getLength()); if(receiveMsg.equals(\"\")) { RunID = false; } else { String ucIP = packet.getAddress().toString(); int ucPort = packet.getPort(); SimpleDateFormat format = new SimpleDateFormat(\"yyyy年MM月dd日 hh:mm:ss\ String ID = \"[\"+\"接收
\"+\"<-\"+ucIP+\":\"+ucPort+\"]\"+\"[\"+format.format(new Date())+\"]\"; //将接收的消息追加到界面上 View.t1.append(ID); View.t1.append(\"\\n\"); View.t1.append(receiveMsg); View.t1.append(\"\\n\"); View.t1.setForeground(Color.BLUE); } }
} catch (SocketException e) { JOptionPane.showMessageDialog(null,\"SocketExcetion in UdpServer!\"); } catch (IOException e) { JOptionPane.showMessageDialog(null,\"IOExcetion in UdpServer!\"); }
socket.close(); } }
第 4 页 共 9 页
课程设计说明书
2.4 EventHandle类
实现ActionListener,WindowListener,KeyListener,TextListener接口,响应界面View上的各种事件。部分代码如下: 当点击按钮时做如下响应:
如果是监听按钮按下,首先判断服务端是否已经打开,如果打开则向服务端发送一个关闭的消息(每次监听应该关闭前一个监听端口,开放新的一个端口)。如果没有打开则先判断打开端口的合法性,如果不合法则给与相应的提示,合法则打开监听端口进行监听。
如果是发送按钮按下,则先判断发送IP和端口的合法性,不合法给与相应的提示,合法则启动发送线程发送消息。
public void actionPerformed(ActionEvent arg0) { if(arg0.getSource() == View.b1) {//按下监听按钮 if(UdpServer.isRun == 1) { new Thread(new UdpClient(\"localhost\关闭现在监听的端口 准备监听新的端口 } try { int ucPort = Integer.parseInt(View.f1.getText()); if((ucPort<1024)||(ucPort>65535)){ JOptionPane.showMessageDialog(null,\"建议使用1024~65535之间的端口号!\"); } else{ Thread t = new Thread(new UdpServer(ucPort,1)); t.start(); View.b1.setEnabled(false); } }catch(NumberFormatException e){ JOptionPane.showMessageDialog(null,\"端口号必须为数字!\"); } }
else if(arg0.getSource() == View.b2) {//按下发送按钮 String usIP = View.f2.getText(); if(View.isValidIPAddress(usIP) == true) { try { int usPort = Integer.parseInt(View.f3.getText()); if((usPort<1024)||(usPort>65535)) { JOptionPane.showMessageDialog(null,\"建议使用1024~65535之间的端口号!\"); }
第 5 页 共 9 页
课程设计说明书
else { String sMsg = View.t2.getText(); SimpleDateFormat format = new SimpleDateFormat(\"yyyy年MM月dd日 hh:mm:ss\ String ID = \"[\"+\"发送
\"+\"->\"+usIP+\":\"+usPort+\"]\"+\"[\"+format.format(new Date())+\"]\"; View.t1.append(ID); View.t1.append(\"\\n\"); View.t1.append(sMsg); View.t1.append(\"\\n\"); View.t2.setText(null); View.t1.setForeground(Color.RED); new Thread(new UdpClient(usIP,usPort,sMsg)).start(); } }catch(NumberFormatException e) { JOptionPane.showMessageDialog(null,\"端口号必须为数字!\"); } } else { JOptionPane.showMessageDialog(null,\"请输入合法的IP地址!\"); } } }
当组合键(Ctrl+Enter)响应时,事件的处理与发送按钮一样。 对window窗口的响应,直接调用System.out.Exit(0),退出程序。
对于TextEvent的响应,当f1不等于空时,监听按钮可以被点击,否则不可点击。当f2,f3,t2都不为空时,发送按钮可以被点击否则不可点击。 public void textValueChanged(TextEvent arg0) { // TODO Auto-generated method stub if(arg0.getSource() == View.f1) { if(View.f1.getText().length() != 0) { View.b1.setEnabled(true); } else { View.b1.setEnabled(false); } }
else if((arg0.getSource() == View.f2)||(arg0.getSource() == View.f3)||(arg0.getSource() == View.t2)) { if((View.f2.getText().length() != 0)&&(View.f3.getText().length() != 0)&&(View.t2.getText().length() != 0)) {
第 6 页 共 9 页
课程设计说明书
}
}
}
View.b2.setEnabled(true); } else { View.b2.setEnabled(false); }
2.5 MainClass类
实现对View视图的实类化
public class MainClass {
public static void main(String[] args) { new View(); } }
3测试试报告
服务端在进行重新设定端口时,之前打开的端口仍然开放。为了使服务端监听的端口数为一个,在每次开放新端口之前,用本地客户端向服务端发送一个“关闭的消息”,就可以使服务端在开放新端口之前关闭前一个打开的端口。
在判断组合键时,按键抬起时,应该判断只要有一个按键抬起,相应的方法就响应,并做出处理。
应该对IP地址端口号的合法性进行检查。
对程序中socket的异常处理,应该给予友好的提示。
4 测试结果
先输入监听端口号,如果你输入的不是数字,会弹出对话框“端口号必须为数字”,如图4.1所示;如果输入端口号小于1024或者大于65535,这时候会弹出对话框“建议使用1024~65535之间的端口号”如图4.2所示;在输入对方IP地址的时候,必须为对方的主机的IP,而且地址格式要填写正确,否则则会提醒“请输入合法的IP地址”如图4.3所示;如果IP地址,端口号都填写正确后即可建立连接,可进行正常的通信,如图4.4所示。
此处截图自己从那两个文档找
第 7 页 共 9 页
课程设计说明书
总结
此设计达到了预期的功能,在准确配对服务器和客户端后,实现了即时的网络通信,完整了一个简单的网络聊天软件的功能。该程序实现的聊天工具操作简单,只需要正确配对,即可建立连接,然后就能进去即时聊天,快速便捷,满足了一定的需求。但此程序的功能比较简单,很多地方还不够完善,和现在流行的网络聊天工具如腾讯的QQ,微软的MSN,移动的飞信等还有很大的差距。这些不足有:不能群聊,只能实现点对点的通信;程序界面做的比较单一,不够美观,缺少层次性的美感,观赏性较差;用户登录前必须先知道服务器端的IP,这样操作显然比较麻烦;不能随意的添加陌生人,不能实现广泛的社交功能。
第 8 页 共 9 页
课程设计说明书
参考文献
[1].陈伟主.数据通信与计算机网络[M].武汉:武汉理工大学出版社,2004。 [2].Douglas E.Comer. Computer Networks and Internets--- with Internet
Application[M] (Third Edition).北京:清华大学出版社,2003。 [3].谢希仁.计算机网络[M](第三版)西安:电子工业出版社,2003。 [4]陈国君、陈磊、陈锡祯等.Java2程序设计基础[M](第一版).北京:清华大学出版社,2008。
[5] 朱福喜,路迟.JAVA语言与面向对象程序设计[M]. 武汉:武汉大学出
版社,2006。
[6] 朱福喜,余振坤 ,尹为民. Java语言与面向对象程序设计[M]. 武汉:武
汉大学出版社,2005。
[7] 唐大仕. Java程序设计[M]. 北京:北方交通大学出版社,2009。 [8] 耿祥义,张跃平.Java2.实用教程[M].北京:清华大学出版社 ,2010。
第 9 页 共 9 页
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务