当前位置:文档之家› Socket和多线程编程的聊天程序实现

Socket和多线程编程的聊天程序实现

一、课题内容和要求
1.课题内容
基于Socket和多线程编程的聊天程序实现
2.课题要求
网络聊天程序设计非常复杂,允许多个人同时聊天更加需要多线程技术的支持,请实现一个简单的多线程网络聊天程序模拟。

二、设计思路分析
1. 在网络越来越发达的今天,人们对网络的依赖越来越强,网络聊天已经成了许多人生活中必不可少的一部分,基于这样的需求,出现了许多网络聊天通信工具,像QQ,MSN 等等,但是人们已经不再满足于单一的两个人之间的聊天,而是对多人同时聊天产生了兴趣,于是出现了网络聊天室,不同地方的人可以在那个虚拟的聊天室里面热烈聊天。

基于这样的想法,我们用JAVA设计一个多人同时聊天的小程序,用Socket编程实现网络通讯,面向连接的,采用多线程的实现技术。

2. 在程序中,可以设置加入连接的最大数目,通过更改IP地址和端口号,成为不同的客户端,与服务器端连接,进行多用户聊天。

%
3. 为方便用户交互,我们采用图形化的用户界面。

实现了好友添加,消息收发、显示等基本功能。

三、概要设计
该网络聊天程序大致分为三个主要部分:客户端、服务器端和用户图形界面。

各个部分的初步设计思想、流程及存储结构如下:
1. 程序整体框架:主程序监听一端口,等待客户接入;同时构造一个线程类,准备接管会话。

当一个Socket会话产生后,将这个会话交给线程处理,然后主程序继续监听。

打开Socket
命名

监听端口
建立连接
收发消息
关闭连接

打开Socket
连接服务器
收发消息
;
关闭连接
服务器端程序
客户端程序
2. 客户端(Client)
客户端,使用Socket对网络上某一个服务器的某一个端口发出连接请求,一旦连接成功,打开会话;会话完成后,关闭Socket。

客户端不需要指定打开的端口,通常临时的、动态的分配一个端口。


3. 服务器端(Server)
服务器端,使用ServerSocket监听指定的端口,端口可以随意指定(由于1024以下的端口通常属于保留端口,在一些操作系统中不可以随意使用,所以建议使用大于1024的端口),等待客户连接请求,客户连接后,会话产生;在完成会话后,关闭连接。

4. 用户图形界面
用户图形界面方便程序与用户的交互,多个用户参加,完成会话功能,具体的设计要方便用户的使用,直观清晰,简洁明了,友好美观。

5. 存储结构
四、详细设计
代码分服务器端、客户端、和用户图形界面三部分,分别如下:
1.服务器端
服务器端主要是使用ServerSocket类,相当于服务器Socket,用来监听试图进入的连接,当新的连接建立后,该类为他们实例化一个Socket对象,同时得到输入输出流,调用相应方法完成会话。

具体代码如下:
package .*;

import .*;
import .*;
public class Server extends Thread {
ServerSocket skt; ....");
while (true) {
try {
Client[k] = ();
tart();
~
客户端“+ Client[k].getInetAddress() + "已连线\n");
etClient().getOutputStream());
i = server[k].getI();
k++;
} else {
etInputStream()));
theOutputStream = new PrintStream());
·
while (true) {
readin = ();
+ "\n");
}
} catch (SocketException e) {
"连线中断!\n");
户端
客户端主要是使用Socket类,该类是JAVA实现网络编程重要的基础类,实现程序间双向的面向连接的通信。

调用public Socket(String host,int port)方法设定IP和端口。

建好连接后,用户通过得到Socket的输入输出流对象后,利用流的方法实现数据的传输。

调用public InputStream getInputStream()和public OutputStream getOutputStream()方法,分别得到Socket对象的输入输出流;。

具体实现代码如下:
package .*;
import .*;
import class Client extends Thread {
Socket skt; 户图形界面
该部分主要是完成界面的初始化,合理布局组件,方便用户交互。

主要是JAVA按钮,文本
域,标签,布局管理器的使用。

主要处理了键盘Enter消息接受,下面是实现代码:package .*;
import class Face extends Frame {
)
private static final long serialVersionUID = 1L;
Button clientBtn, serverBtn;
TextArea ta;
TextField tfaddress, tfport, tftype;
Label lbl1,lbl2,lbl3;
int port;
Client client;
(
Server server;
boolean iamserver;
static Face frm;
public Face() {
序运行初始化界面如下:
2.输入发送的聊天内容后的测试效果:

通过以上测试分析可知,程序很好地完成了课题的要求,运行结果正确,利用JAVA语言的异常处理机制很好地处理了各种异常,使得程序的性能变得相对稳定,界面舒适易用,可以满足基本聊天需要!
一、调试过程中的问题
程序的调试相对程序的编码复杂多了,需要很大的精力才能做好。

1.问题的描述
(1) JAVA语言的基本知识已具备,但是Socket网络方面还不是很了解,花了不少工夫。

Socket(套接字),用于描述IP 地址和端口,通信链的句柄。

应用程序通常通过它向网络发出或应答请求。

有Socket和ServerSocket两个类,ServerSocket用于服务器端,Socket是建立网络连接时使用的。

在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成会话。

(2) 关于IP地址的获取,刚开始不知道通过什么方法解决,后来查书知道JAVA的InetAddress类,可以得到主机地址。

但是我想通过程序自动获取加进来的IP地址,可以调用public byte[] getAddress()方法,但是没能成功,相互的连接也不是很顺畅,留待下次解决。

2.程序改进的思考
程序只是实现了简单的收发消息功能,功能比较单一,还有许多改进提升的地方。

(1)增加登录界面,用户通过号码和口令进入系统,对用户身份进行验证增加系统的安全性。

(2)可以考虑保存聊天记录功能,方便用户查看。

(3)界面美化方面比较欠缺,可以更加友好和美观。

二、专业课程设计总结
第一周的专业课程设计结束了,这是一个不断学习的过程,给我留下了太多的东西。

课题是基于Socket和多线程的聊天程序,我的第一选择就是JAVA语言,因为不管是在网络应用方面还是在多线程支持方面,JAVA都有很大的便利和优势。

同时,我也体会到了开发工具的强大功能。

进一步理解了面向对象的思想。

由于JAVA是面向对象的语言,主要的特征就是封装,写类。

在该课题中,很容易就分成三个类,Server类、Client类和Face类,这样分工明确,几个类可以单独写。

再实例化类对象,完成必要的操作。

其中Server类和Client类都是继承Thread类,Face类继承Frame类,实现代码复用。

每次都会谈到程序调试问题,这是个比较重要的问题,我觉得起初就要用工程的思想,从整体上考虑问题,这样调试起来相对简单。

总之,这要靠不断实践来提高。

类似这样的实践都是不断学习的过程,其中肯定会碰到问题,比如这次的JAVA输入输出流问题,不是容易搞清楚的,就要花时间去学习。

以后这样的情况会很多,我们不可能知道所有,学习新知识的能力就显得特别重要了。

不管是同学、老师还是参考书或是网络,都是我们的帮助源,学习源,感谢老师同学的帮助!
课题采用分组的方式进行,组内互相讨论,使得解决问题更加快捷、高效、全面。

同时也提高了团队协作的能力,但是建议以后组内成员最好分工明确,而不要过多依赖,真正参与进去才能学到东西。

相关主题