1、课程设计说明书(论文)课程名称 Java 程序设计实践 题 目 文字聊天软件设计 专 业 软件工程 班 级 软件 1201 学 号 1211030115 姓 名 赵阳 起止日期 2012.06.24-2012.06.28 指导教师 王洪亮 成 绩 辽宁石油化工大学计算机与通信工程学院摘 要计算机网络的迅速发展,对人类社会诸多领域产生了巨大的影响。尤其是,随着信息时代的来临,人们之间愈来愈趋向于通过网络来交流和传递信息。而聊天系统正是当前人们使用最多的中介。在这个平台上,许多认识或不认识的人们彼此间能够随意的相互交流。因此,开发和构架这种平台符合时代发展的需要。本系统在开发中用到了局域网通信机制
2、的原理,通过直接继承 Thread 类来建立多线程。开发中利用了计算机网络编程的基本理论知识,如 TCP/IP 协议、客户端/服务器端模式(Client/Server 模式)网络编程的设计方法等。在网络编程中对信息的读取、发送,是利用流来实现信息的交换,其中介绍了对实现一个系统的信息流分析,包含了一些基本的软件工程方法。AbstractThe rapid development of computer networks, many areas of human society had a huge impact. In particular, with the advent of the in
3、formation age, more and more people tend to pass between the networks to communicate and convey information. The chat system is currently the most people to use intermediaries. On this platform, a lot of people know or do not know each other can freely mutual exchange. Therefore, the development and
4、 architecture of this platform meets the needs of the times.The system used in the development of a local area network communication mechanism principle, through the direct successor to the Thread class to create multiple threads. Developed a computer network using basic theoretical knowledge of pro
5、gramming, such as TCP / IP protocol, the client / server mode (Client / Server mode) network programming design method. In network programming to read the information, sending, is the use of the exchange of information flow to achieve, which describes the realization of a systematic information flow
6、 analysis, contains some basic software engineering methods.目录1 设计要 求 .72 设计原理和技术 .72.1 设计原理与开发工具 .72.2 设计技术 .73 总体设计 .84 详细设计及实现 .84.1 详细设计 .84.1.1 设计方法 .84.1.2 流程 图 .94.2 实现过程 .94.2.1 源代码 .94.2.2 运行截图 .245 结束语 26参考文献 .27课程设计任务书一、课程设计的内容和要求(包括原始数据、技术参数、设计要求等)设计并实现一个基于 TCP 协议或者 UDP 协议的文字聊天软件,是点对点的,通
7、信双方都可以主动发起连接。要求:采用 Windows 应用程序风格,功能完整,显示直观,色彩协调,界面友好,操作简单。二、对课程设计成果的要求(包括课程设计说明书(或论文) 、图纸、实物样品等)课程设计说明书(论文)的“正文”中应包括: 设计要求(题目介绍、设计目的、问题陈述) 设计原理和技术(基本原理和技术描述,开发工具和开发环境说明) 总体设计(功能模块划分和描述) 详细设计及实现(各功能模块的实现,主要程序代码及其说明和注释,所实现系统的运行界面截图,遇到的主要问题及解决方法) 结束语(课程设计的收获和体会,设计中的不足和可改进的地方)三、主要参考资料 谢希仁.计算机网络(第 4 版).
8、电子工业出版社 胡伏湘 Java 程序设计实用教程(第 2 版)清华大学出版社 编程相关资料电子文档:第 11 章 网络编程.pptJDK_API_1_6_zh_CN.CHM四、课程设计进度计划课程设计内容 小 计总体设计 0.5 天详细设计 0.5 天源程序编写调试 4 天撰写报告 1 天总 计 1 周系(教研组)主任审查意见:系主任(签字):年 月 日指导教师评语:成绩: 指导教师(签字):年 月 日正文1 设计要求设计并实现一个基于 TCP 协议或者 UDP 协议的文字聊天软件,是点对点的,通信双方都可以主动发起连接。要求:采用Windows 应用程序风格,功能完整,显示直观,色彩协调,
9、界面友好,操作简单。2 设计原理和技术2.1 设计原理与开发工具文字聊天软件设计所用的原理主要是网络编程原理,其中使用到的多线程原理和图形界面原理,所用的开发工具为MyEclipse。2.2 设计技术此次使用了基于 TCP 协议的 Socket 通讯技术。Socket 通信程序的功能基本结包括以下 5 个基本步骤:服务器端创建 ServerSocket,并调用 accept()方法监听。客户端创建 Socket 连接服务器。连接上之后,客户端和服务器端都打开连接到 Socket 的输入/输出流。客户端和服务器端利用输入/输出流,按照一定的协议进行读/写操作。客户端和服务器端关闭输入/输出流和
10、Socket。Server ClinetServerSocket(port#)Socket socket=ServerSocket.accept()接收连接Socket(host,port#)与服务器建立连接OutputStream OutputStreamClose Socket Close SocketInputStream InputStream图2-1 Socket通信的步骤3 总体设计通过了解课程设计要求,实现文字聊天功能,并且要把客户端和用户端整合在一个程序里,为保证要求与实现功能方便,将监听和通信功能代码设计在界面类里,简单明了,容易实现。4 详细设计及实现4.1 详细设计实现课
11、程设计要求,设计时采用了一个模块,将链接、监听、通信功能放在一个类里。4.1.1 设计方法类里包括 server()函数、client()函数,server()函数创建了一个监听线程,用于监听对方的链接。client()函数也创建了一个线程,链接对方 IP 地址,server()函数和 client()函数中都含有通信功能,以便通信。程序采用图形界面结构,这样使界面更加友好,在这里我使用了 MyEclipse8.6,选择使用 Swing 组件,进行界面的排版,在里面有有许多按钮,对其中一个 Button 按钮进行监听,输出文本信息,达到双方通信的要求。4.1.2 流程图开始初始化各界面变量建立
12、 Server ()线程绑定 Socket 进行监听监听 IP 收发数据收发信息是否与其他链接结束开始初始化各界面变量建立 Clinet ()线程建立 Socket()输入 IP 地址连接 IP 收发数据收发信息结束是否与其他链接YES YESNO NOserver()函数线程 client()函数线程建立 Socket()4.2 实现过程4.2.1 源代码import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.PrintWriter;import .ServerSocket;import .S
13、ocket;import java.util.Calendar;SuppressWarnings(“serial“)public class ConversationWindow extends javax.swing.JFrame public ConversationWindow() initComponents();/GEN-BEGIN:initComponents/ private void initComponents() jTextField1 = new javax.swing.JTextField();jTextField2 = new javax.swing.JTextFie
14、ld();jTextField3 = new javax.swing.JTextField();jToggleButton1 = new javax.swing.JToggleButton();jToggleButton2 = new javax.swing.JToggleButton();jToggleButton3 = new javax.swing.JToggleButton();jScrollPane1 = new javax.swing.JScrollPane();jScrollPane2 = new javax.swing.JScrollPane();jTextArea1 = ne
15、w javax.swing.JTextArea();jTextArea2 = new javax.swing.JTextArea();jButton1 = new javax.swing.JButton();jLabel1 = new javax.swing.JLabel();setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);setTitle(“聊天页面“);/设置标题为“ 聊天页面”setResizable(false);/设置框架不可变jTextField1.setText(“u7528u62371“);
16、jTextField1.setToolTipText(“u8bbeu7f6eu4f60u7684u6635u79f0“);jToggleButton1.setText(“u9501u5b9a“);jToggleButton1.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jToggleButton1ActionPerformed(evt););jLabel1.setText(“u5bf9u65b9IP:“);jTo
17、ggleButton2.setText(“u8fdeu63a5“);jToggleButton2.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jToggleButton2ActionPerformed(evt););jTextArea1.setColumns(20);jTextArea1.setEditable(false);jTextArea1.setRows(5); jScrollPane1.setViewp
18、ortView(jTextArea1);jTextArea2.setColumns(20);jTextArea2.setRows(5);jScrollPane2.setViewportView(jTextArea2);jButton1.setText(“u53d1u9001“);jButton1.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jButton1ActionPerformed(evt););jTextF
19、ield3.setText(“u7528u62372“);jTextField3.setToolTipText(“u8bbeu7f6eu5bf9u65b9u6635u79f0“);jToggleButton3.setText(“u9501u5b9a“);jToggleButton3.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent evt) jToggleButton3ActionPerformed(evt););javax.s
20、wing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane();getContentPane().setLayout(layout);layout.setHorizontalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGroup(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(java
21、x.swing.GroupLayout.Alignment.LEADING).addGroup(javax.swing.GroupLayout.Alignment.TRAILING,layout.createSequentialGroup().addComponent(jScrollPane2,javax.swing.GroupLayout.DEFAULT_SIZE,505,Short.MAX_VALUE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jButton1,java
22、x.swing.GroupLayout.PREFERRED_SIZE,106,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jScrollPane1,javax.swing.GroupLayout.DEFAULT_SIZE,618,Short.MAX_VALUE).addGroup(layout.createSequentialGroup().addComponent(jTextField1,javax.swing.GroupLayout.PREFERRED_SIZE,80,javax.swing.GroupLayout.PREFER
23、RED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jToggleButton1).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jTextField3,javax.swing.GroupLayout.PREFERRED_SIZE,80,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(ja
24、vax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jToggleButton3).addGap(84,84,84).addComponent(jLabel1).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jTextField2,javax.swing.GroupLayout.PREFERRED_SIZE,132,javax.swing.GroupLayout.PREFERRED_SIZE).addPre
25、ferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jToggleButton2,javax.swing.GroupLayout.DEFAULT_SIZE,javax.swing.GroupLayout.DEFAULT_SIZE,Short.MAX_VALUE).addContainerGap();layout.setVerticalGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addGrou
26、p(layout.createSequentialGroup().addContainerGap().addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE).addComponent(jTextField1,javax.swing.GroupLayout.PREFERRED_SIZE,25,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jToggleButton1,javax.swing.GroupLayout.PREFERRED_
27、SIZE,25,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jTextField3,javax.swing.GroupLayout.PREFERRED_SIZE,25,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jToggleButton2,javax.swing.GroupLayout.PREFERRED_SIZE,25,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jToggleButton3,javax.s
28、wing.GroupLayout.PREFERRED_SIZE,25,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jTextField2,javax.swing.GroupLayout.PREFERRED_SIZE,25,javax.swing.GroupLayout.PREFERRED_SIZE).addComponent(jLabel1).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addComponent(jScrollPane1,ja
29、vax.swing.GroupLayout.PREFERRED_SIZE,198,javax.swing.GroupLayout.PREFERRED_SIZE).addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED).addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING).addComponent(jButton1,javax.swing.GroupLayout.DEFAULT_SIZE,76,Short.MAX_
30、VALUE).addComponent(jScrollPane2,javax.swing.GroupLayout.PREFERRED_SIZE,76,javax.swing.GroupLayout.PREFERRED_SIZE).addContainerGap();jToggleButton1.getAccessibleContext().setAccessibleName(“);pack();setVisible(true);/ /GEN-END:initComponentsprivate void jButton1ActionPerformed(java.awt.event.ActionE
31、vent evt) Calendar c = Calendar.getInstance();/调用系统时间 ,使输出显示时间。int y = c.get(Calendar.YEAR);int M = c.get(Calendar.MONTH) + 1;int d = c.get(Calendar.DAY_OF_MONTH);int h = c.get(Calendar.HOUR_OF_DAY);int mm = c.get(Calendar.MINUTE);int ss = c.get(Calendar.SECOND);String st = jTextArea2.getText();Name
32、 = jTextField1.getText();jTextArea1.append(y + “-“ + M + “-“ + d + “ “ + h + “:“ + mm + “:“+ ss + “n“ + Name + “说: “ + st + “n“);jTextArea2.setText(“);/清空文本out.println(st);/将输入的文本传出private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) /打开开关时将文本条里的内容作为本机用户名,并将文本条设置为不可写/关闭开关时将文本条设
33、置为可写if (jToggleButton1.isSelected() jTextField1.setEditable(false);jToggleButton1.setText(“u66f4u6539“);Name = jTextField1.getText(); else jTextField1.setEditable(true);jToggleButton1.setText(“u786eu5b9a“);private void jToggleButton2ActionPerformed(java.awt.event.ActionEvent evt) /打开开关时将文本条里的内容作为 ip
34、 地址,调用 clinet(),并将文本条设置为不可写/关闭开关时将文本条设置为可写if (jToggleButton2.isSelected() IP = jTextField2.getText();client();jTextField2.setEditable(false);jToggleButton2.setText(“u66f4u6539“); else jTextField2.setEditable(true);jToggleButton2.setText(“u8fdeu63a5“);private void jToggleButton3ActionPerformed(java.a
35、wt.event.ActionEvent evt) /打开开关时将文本条里的内容作为对方用户名,并将文本条设置为不可写/关闭开关时将文本条设置为可写if (jToggleButton3.isSelected() jTextField3.setEditable(false);jToggleButton3.setText(“u66f4u6539“);Name1 = jTextField3.getText(); else jTextField3.setEditable(true);jToggleButton3.setText(“u786eu5b9a“);/作服务器端时运行的程序public void
36、 server() new Thread() public void run() try ServerSocket server = new ServerSocket(8000);/监听8000 端口Socket socket = server.accept();jTextArea1.append(“*已被其他用户链接*n“);/输出“*已被其他用户链接*”提示InputStreamReader in = new InputStreamReader(socket.getInputStream();BufferedReader sin = new BufferedReader(in);out =
37、 new PrintWriter(socket.getOutputStream(), true);Calendar c = Calendar.getInstance();int y = c.get(Calendar.YEAR);int M = c.get(Calendar.MONTH) + 1;int d = c.get(Calendar.DAY_OF_MONTH);int h = c.get(Calendar.HOUR_OF_DAY);int mm = c.get(Calendar.MINUTE);int ss = c.get(Calendar.SECOND);while (true) St
38、ring s = sin.readLine();jTextArea1.append(y + “-“ + M + “-“ + d + “ “ + h+ “:“ + mm + “:“ + ss + “n“ + Name1 + “说:“ + s+ “n“); catch (Exception e) e.printStackTrace();.start();/作用户端时运行的程序public void client() new Thread() public void run() try Socket socket = new Socket(IP, 8000);/链接out = new PrintWr
39、iter(socket.getOutputStream(), true);InputStreamReader in = new InputStreamReader(socket.getInputStream();BufferedReader sin = new BufferedReader(in);jTextArea1.append(“*已链接上目标用户*n“);/输出“*已链接上目标用户*”提示Calendar c = Calendar.getInstance();int y = c.get(Calendar.YEAR);int M = c.get(Calendar.MONTH) + 1;i
40、nt d = c.get(Calendar.DAY_OF_MONTH);int h = c.get(Calendar.HOUR_OF_DAY);int mm = c.get(Calendar.MINUTE);int ss = c.get(Calendar.SECOND);while (true) String s = sin.readLine();jTextArea1.append(y + “-“ + M + “-“ + d + “ “ + h+ “:“ + mm + “:“ + ss + “n“ + Name1 + “说: “ + s+ “n“); catch (Exception e) e
41、.printStackTrace();.start();/* param args the command line arguments*/public static void main(String args) ConversationWindow server = new ConversationWindow();server.server();/GEN-BEGIN:variables/ Variables declaration - do not modifyprivate javax.swing.JButton jButton1;private javax.swing.JLabel j
42、Label1;private javax.swing.JScrollPane jScrollPane1;private javax.swing.JScrollPane jScrollPane2;private javax.swing.JTextArea jTextArea1;private javax.swing.JTextArea jTextArea2;private javax.swing.JTextField jTextField1;private javax.swing.JTextField jTextField2;private javax.swing.JTextField jTex
43、tField3;private javax.swing.JToggleButton jToggleButton1;private javax.swing.JToggleButton jToggleButton2;private javax.swing.JToggleButton jToggleButton3;private PrintWriter out;private String IP;private String Name;private String Name1;/ End of variables declaration/GEN-END:variables4.2.2 运行截图启动界面
44、链接界面 1-1链接界面 1-2聊天界面 2-1聊天界面 2-25 结束语通过此次课程设计,总结自己对以前所学的知识,在老师和同学的帮助下,完成了此次设计,使我对 Java 产生了浓厚的兴趣。通过对 Swing 组件排版,使界面友好化,很不容易,总觉得不舒服,经过多次调整,终于达到理想的效果。虽然程序基本能够实行,但是还是有许多不足,例如:空文本消息也可以发送,但是没有实际意义,所以应该禁止空文本发送;信息量较大时,文本框出现滚动条,不能自动显示出下面的文字,即滚动条不能自动下移;没有设计键盘发送监听,发送消息只能用鼠标,给用户带来不方便等在课程设计过程中,出现了很多问题,例如;文本显示位置不正确、程序不能执行、执行时没有页面显示等这些小问题很多是不细心导致的,以后应在加大对写程序的训练,熟悉一些常见的错误,自己找到解决办法。非常感谢同学和老师的耐心指导,使我真正的学习到了知识。参考文献1 谢希仁. 计算机网络( 第 4 版)M. 电子工业出版社,2009.2 胡伏湘. Java 程序设计实用教程(第 2 版)M. 清华大学出版社,2009.3 第 11 章 网络编程.ppt.4 JDK_API_1_6_zh_CN.CHM.