Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx

上传人:b****7 文档编号:22069646 上传时间:2023-02-02 格式:DOCX 页数:18 大小:139.05KB
下载 相关 举报
Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx_第1页
第1页 / 共18页
Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx_第2页
第2页 / 共18页
Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx_第3页
第3页 / 共18页
Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx_第4页
第4页 / 共18页
Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx

《Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。

Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx

将客户所发送的信息由客户端由网络传到服务器端上,并且接受航服务器返回的接收方发送的信息,然后存储起来。

2.背景知识

SOCKET

Socket可以看成在两个程序进行通讯连接中的一个端点,是连接应用程序和网络驱动程序的桥梁,Socket在应用程序中创建,通过绑定与网络驱动建立关系。

此后,应用程序送给Socket的数据,由Socket交网络驱动程序向网络上发送出去。

计算机从网络上收到与该Socket绑定IP地址和端口号相关的数据后,由网络驱动程序交给Socket,应用程序便可从该Socket中提取接收到得数据,网络应用程序就是这样通过Socket进行数据的发送与接收的

(1)创建Socket;

(2)打开连接到Socket的输入/出流;

(3)按照一定的协议对Socket进行读/写操作;

(4)关闭Socket.

IO技术

阻塞模式

可能造成阻塞的函数有:

connect()、accept()、读写函数

C/S两端通过Socket机制进行连接

(1)客户端的编程流程:

创建Socket对象,向Server的监听端口请求;

通过向新Socket中读写数据与Server端通信;

关闭Socket,结束与Server端;

(2)服务器端的编程流程:

打开ServerSocket,创建一个服务器型套接字和一个普通套接字,服务器型套接字在指

定端口为客户端请求的Socket服务;

2等待来自客户端的Client端的请求;

3接收Client端的请求,用返回的Socket建立连接;

4通过向Socket中读写数据来与Client端通信;

5关闭Socket,结束与当前Client端的通信;

6关闭SerketSocket对象结束监听服务。

3.客户端设计

客户端主要完成建立连接、消息输入、消息发送、消息存储功能。

功能含义如下:

1.建立连接:

建立一个ServerSocket连接,不断侦听是否有服务端连接或者断开连接。

2.消息输入:

根据用户输入的消息,将消息显示在屏幕面板上。

3.消息发送:

把用户输入的消息作为字符串通过Socket端口发送到服务器。

4.消息存储:

把用户输入的消息存储到data.txt文件中,以便用户以后查阅聊天记录。

客户端设计如下:

1.界面设计

2.连接设计

3.接收信息设计

4.用户信息设计

5.帮助设计

客户端用户设计的IP地址和端口号连接到相应的服务器,通过接收用户输入的消息,然后通过所监听的端口把消息发送到服务端,由服务端把消息发送到指定的用户

用户连接服务器

1客户端请求连接

客户端通过connect()请求连接,填写端口号以及IP地址,填写自己的信息。

2服务器端响应

服务器端的监听器监听到客户端的连接请求后,检测后允许客户端连接到服务器。

3给客户端返回信息

连接成功后服务器返回给客户端连接成功的信息,并且给所有的用户发送用户登录信息。

4关闭Socket连接

当以上的程序都正常运行后,需要关闭Socket连接,否则将会浪费服务器与客户端之间的资源。

5用户退出

5.1接收退出信息

当用户退出时,客户端将会用基于Socket的对象输出流发送给服务器退出对象。

5.2在线列表中删除用户

用户退出后应该把用户从在线列表中删除,否则用户退出用户还在在线列表中,那么该用户下次将会无法登录。

5.3更新在线列表

用户退出后将服务器端监控界面的用户列表更新。

否则用户数据将会不同步。

4.客户端主要代码

/**

*?

?

*/

publicvoidactionPerformed(ActionEvente){

Objectobj=e.getSource();

if(obj==userItem||obj==userButton){//?

//?

UserConfuserConf=newUserConf(this,userName);

userConf.setVisible(true);

userName=userConf.userInputName;

}

elseif(obj==connectItem||obj==connectButton){//?

ConnectConfconConf=newConnectConf(this,ip,port);

conConf.setVisible(true);

ip=conConf.userInputIp;

port=conConf.userInputPort;

elseif(obj==loginItem||obj==loginButton){//?

Connect();

elseif(obj==logoffItem||obj==logoffButton){//?

DisConnect();

showStatus.setText("

"

);

elseif(obj==dataItem){

try{

Fileread=newFile("

data.txt"

Desktop.getDesktop().open(read);

}catch(IOExceptione1){

e1.printStackTrace();

}

elseif(obj==clientMessage||obj==clientMessageButton){//?

SendMessage();

clientMessage.setText("

elseif(obj==exitButton||obj==exitItem){//?

intj=JOptionPane.showConfirmDialog(

this,"

"

JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if(j==JOptionPane.YES_OPTION){

if(type==1){

DisConnect();

}

System.exit(0);

elseif(obj==helpItem){//?

HelphelpDialog=newHelp(this);

helpDialog.setVisible(true);

}

publicvoidrun(){

while(!

socket.isClosed()){

Stringtype=(String)input.readObject();

if(type.equalsIgnoreCase("

)){

Stringsysmsg=(String)input.readObject();

SimpleDateFormatsdf=newSimpleDateFormat("

yyyy-MM-ddHH:

mm:

ss"

Stringly_time=sdf.format(newDate());

textarea.append(ly_time);

textarea.append("

\n"

:

"

+sysmsg);

elseif(type.equalsIgnoreCase("

output.close();

input.close();

socket.close();

!

break;

Stringmessage=(String)input.readObject();

textarea.append(message);

try{

record=newBufferedWriter(newFileWriter("

true));

record.write(ly_time);

record.newLine();

record.write(message);

record.close();

}catch(IOExceptione){

e.printStackTrace();

}

Stringuserlist=(String)input.readObject();

Stringusernames[]=userlist.split("

combobox.removeAllItems();

inti=0;

combobox.addItem("

while(i<

usernames.length){

combobox.addItem(usernames[i]);

i++;

combobox.setSelectedIndex(0);

showStatus.setText("

+usernames.length+"

?

catch(Exceptione){

System.out.println(e);

}

5.设计体会

本次课程设计历时将近两个月,当老师布置课程设计题目时还觉得这个课程设计很简单,再加上正在学Java,以及相关界面设计,当时还没有学Socket编程,觉得只要学号Socket就行差不多了,但是在做的过程中,要写需求分析等资料,之前也没怎么写过,对这方面不是很了解,所以遇到了种种困难,好多功能和逻辑都没想到,导致后来写程序的时候走了很过弯路。

还有就是在学习Socket编程的时候,本来觉得不就是Java里面的一个类吗,这还不好写吗,但是真的用起来,就没有那么简单了,不是这儿出错就是那儿出错,最后看了几个例子,然后有看了好多的API函数,慢慢的,也就写的越来越顺手了。

服务器端程序设计模块:

作为C/S模式下的系统开发,很显然服务器端程序的设计是非常重要的。

下面就服务器端的相关程序模块进行设计,并一定程度上实现了相关功能。

主服务器类的设计

设计服务器时需要考虑如下几个因素:

(1)服务器的运行速度;

(2)服务器的响应速度,包括新建连接和发送数据的响应速度;

(3)I/O吞吐量;

(4)其他:

流量控制(QoS)、安全性。

针对TCP/IP协议的数据结构,设计服务器的程序结构需要考虑以下的因素:

(1)多线程;

(2)多进程;

(3)单线程。

主服务器类实现了服务器端的多线程,使用SeverSockets=newServerSocket(8080)语句在8080端口创建套接口;

使用newServerThread(socket)语句创建新的线程。

主服务器类调用ServerThread类,而每个ServerThread实体就是一个独立的线程,刚好对应于客户端的连接请求响应线程。

服务器端有一个(或多个)进程在指定的端口等待客户的连接信息,一旦连接成功,就可以按设计的数据交换方法和格式进行数据传输。

客户端只在需要的时候向服务器端发出连接请求。

实现界面如图

服务器端完成的功能是:

对服务器的某一可用端口进行监听,以获得客户端请求,从而对客户端请求进行处理。

因为是多客户同时请求,所以要采用多线程,为每一个在线用户分配一个线程,实时处理每个客户端的请求。

因此,

对服务器端程序抽象如下:

2、公共数据处理

处理公共数据。

如在线人数统计,客户的公共数据(如通知等),客户数据资料的存储与读取等(与数据库交互);

3、端口监听器

监听服务器某一端口,为每一在线客户建立一个会话线程;

4、客户请求处理

处理客户的请求。

根据客户的请求执行相应的操作。

5、服务器管理器

服务器端的管理工具,如对数据进行统计

服务器端的结构图:

服务器实现所涉及的几个主要类以及各个类中主要的方法实现:

1.ChatServer.java服务器的主框架类。

此类实现接口ActionListener,用于对用户事件的监听,以及对事件的处理。

publicvoidactionPerformed(ActionEvente)

{

if(obj==startServer||obj==startItem)

{//?

startService();

}elseif(obj==stopServer||obj==stopItem)

intj=JOptionPane.showConfirmDialog(this,"

"

JOptionPane.YES_OPTION,JOptionPane.QUESTION_MESSAGE);

if(j==JOptionPane.YES_OPTION)

{

stopService();

}elseif(obj==portSet||obj==portItem)

//?

PortConfportConf=newPortConf(this);

portConf.setVisible(true);

}elseif(obj==exitButton||obj==exitItem)

}elseif(obj==helpItem)

}elseif(obj==sysMessage||obj==sysMessageButton)

sendSystemMessage();

}

*此函数用于?

器,并在指定的端口监听客户端的连接

publicvoidstartService()

try

{

serverSocket=newServerSocket(port,10);

messageShow.append("

?

+port+"

...\n"

startServer.setEnabled(false);

startItem.setEnabled(false);

portSet.setEnabled(false);

portItem.setEnabled(false);

stopServer.setEnabled(true);

stopItem.setEnabled(true);

sysMessage.setEnabled(true);

}catch(Exceptione)

e.printStackTrace();

userLinkList=newUserLinkList();

listenThread=newServerListen(serverSocket,combobox,messageShow,showStatus,userLinkList);

listenThread.start();

input,output?

socket?

publicvoidstopService()

sendStopToAll();

listenThread.isStop=true;

serverSocket.close();

intcount=userLinkList.getCount();

inti=0;

while(i<

count)

Nodenode=userLinkList.findUser(i);

node.input.close();

node.output.close();

node.socket.close();

i++;

stopServer.setEnabled(false);

stopItem.setEnabled(false);

startServer.setEnabled(true);

startItem.setEnabled(true);

portSet.setEnabled(true);

portItem.setEnabled(true);

sysMessage.setEnabled(false);

combobox.removeAllItems();

combobox.addItem("

2.ServerListen.java?

此类继承于Thread类,服务器的监听类,等待用户的连接,并且给在线用户发送上线用户的信息提示。

publicvoidrun(){

isStop&

&

!

server.isClosed()){

client=newNode();

client.socket=server.accept();

client.output=newObjectOutputStream(client.socket.getOutputStream());

client.output.flush();

client.input=newObjectInputStream(client.socket.getInputStream());

client.username=(String)client.input.readObject();

//?

combobox.addItem(client.username);

userLinkList.addUser(client);

SimpleDateFormatsdf=newSimpleDateFormat("

Stringstr=sdf.format(newDate());

texta

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1