好文档 - 专业文书写作范文服务资料分享网站

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. 存储结构

下面列出主要存储结构或变量: 存储结构、变量、对象 post Port Server [ ] Client [ ] Public void run() Server(int port,Face chat) Face() 类型 InetAddress int ServerThread Socket Void public Public 说明 标识IP地址 标识端口 服务器端连接数 客户端连接数 Client类成员函数 Client、Server类成员函数 Server类成员函数 Face类成员函数 Client(String ip,int p,Face chat) public 四、 详细设计

代码分服务器端、客户端、和用户图形界面三部分,分别如下: 1.服务器端

服务器端主要是使用ServerSocket类,相当于服务器Socket,用来监听试图进入的连接,当新的连接建立后,该类为他们实例化一个Socket对象,同时得到输入输出流,调用相应方法完成会话。 具体代码如下:

package nupt.java.socket; import java.awt.*; import java.net.*; import java.io.*;

public class Server extends Thread {

ServerSocket skt; // ServerSocket类监听进入的连接,为每个新的连接产生一个Socket对象

Socket Client[ ]=new Socket[10];

Socket Client1=null; int i = 0; TextArea in; int port,k=0,l=0;

PrintStream theOutputStream; Face chat;

public Server(int port, Face chat) { try {

this.port = port;

skt = new ServerSocket(port); this.chat = chat;

} catch (IOException e) {

chat.ta.append(e.toString()); } }

public void run() {

chat.ta.append(\等待连线......\ while (true) { try {

Client[k] = skt.accept();

//当有客户端连接时就新建一个子线程 if (i < 2) {

ServerThread server[] = new ServerThread[10]; server[k]= new ServerThread(Client[k], this.chat, i); l=server.length; server[k].start();

chat.ta.append(“客户端“+ Client*k+.getInetAddress() + \已连线\\n\

//for(int j=0;j

theOutputStream = new PrintStream(server[k].getClient().getOutputStream()); i = server[k].getI(); k++; } else {

//theOutputStream = new PrintStream(null); }

} catch (SocketException e) { } catch (IOException e) {

chat.ta.append(e.toString()); } } }

public void dataout(String data) { //for(int j=0;j

theOutputStream.println(data);

} }

class ServerThread extends Thread { ServerSocket skt; Socket Client; TextArea in; int port,i;

BufferedReader theInputStream; PrintStream theOutputStream; String readin; Face chat; //服务端子线程

public ServerThread(Socket s, Face chat, int i) { this.i = ++i; Client = s;

this.chat = chat; }

public int getI() { return this.i; }

public Socket getClient() { return this.Client; }

public void run() { try {

theInputStream = new BufferedReader(new InputStreamReader(Client .getInputStream()));

theOutputStream = new PrintStream(Client.getOutputStream()); while (true) {

readin = theInputStream.readLine(); chat.ta.append(readin + \ }

} catch (SocketException e) {

chat.ta.append(\连线中断!\\n\ // 设置组件可用性 chat.clientBtn.setEnabled(true); chat.serverBtn.setEnabled(true); chat.tfaddress.setEnabled(true); chat.tfport.setEnabled(true); try { i - -;

skt.close(); Client.close();

} catch (IOException err) {

chat.ta.append(err.toString()); }

} catch (IOException e) {

chat.ta.append(e.toString()); } }

public void dataout(String data) { theOutputStream.println(data); } }

2.客户端

客户端主要是使用Socket类,该类是JAVA实现网络编程重要的基础类,实现程序间双向的面向连接的通信。调用public Socket(String host,int port)方法设定IP和端口。建好连接后,用户通过得到Socket的输入输出流对象后,利用流的方法实现数据的传输。调用public InputStream getInputStream()和public OutputStream getOutputStream()方法,分别得到Socket对象的输入输出流; 具体实现代码如下: package nupt.java.socket; import java.net.*; import java.io.*;

import javax.swing.Timer;

public class Client extends Thread {

Socket skt; // 用于客户端的连接 InetAddress host; // 主机地址 int port; // 端口号 BufferedReader theInputStream; PrintStream theOutputStream; String readin; Face chat;

public Client(String ip, int p, Face chat) { try {

host = InetAddress.getByName(ip); // 获取IP地址 port = p; // 获取端口号 this.chat = chat;

} catch (IOException e) {

chat.ta.append(e.toString()); } }

public void run() { try {

chat.ta.append(\准备连线,稍后!\

skt = new Socket(host, port); // 新建Socket对象 chat.ta.append(\成功\\n\// 缓冲区末尾添加字符串

theInputStream = new BufferedReader(new InputStreamReader(skt.getInputStream()));

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

一、课题内容和要求1.课题内容基于Socket和多线程编程的聊天程序实现2.课题要求网络聊天程序设计非常复杂,允许多个人同时聊天更加需要多线程技术的支持,请实现一个简单的多线程网络聊天程序模拟。二、设计思路分析1.在网络越来越发达的今天,人们对网络的依赖越来越强,网络聊天已经成了许多
推荐度:
点击下载文档文档为doc格式
62ahm13bpc7g2499hhvf
领取福利

微信扫码领取福利

微信扫码分享