Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx
《Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx(18页珍藏版)》请在冰豆网上搜索。
![Java网络聊天室课程设计说明书含源程序Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2023-2/1/42fc1afe-5f70-4ddd-b640-3d118f6baf96/42fc1afe-5f70-4ddd-b640-3d118f6baf961.gif)
将客户所发送的信息由客户端由网络传到服务器端上,并且接受航服务器返回的接收方发送的信息,然后存储起来。
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