BX121028俞佳星课设.docx

上传人:b****4 文档编号:26956517 上传时间:2023-06-24 格式:DOCX 页数:35 大小:634.21KB
下载 相关 举报
BX121028俞佳星课设.docx_第1页
第1页 / 共35页
BX121028俞佳星课设.docx_第2页
第2页 / 共35页
BX121028俞佳星课设.docx_第3页
第3页 / 共35页
BX121028俞佳星课设.docx_第4页
第4页 / 共35页
BX121028俞佳星课设.docx_第5页
第5页 / 共35页
点击查看更多>>
下载资源
资源描述

BX121028俞佳星课设.docx

《BX121028俞佳星课设.docx》由会员分享,可在线阅读,更多相关《BX121028俞佳星课设.docx(35页珍藏版)》请在冰豆网上搜索。

BX121028俞佳星课设.docx

BX121028俞佳星课设

目录

目录I

1课程设计内容1

1课程设计目的1

2概要设计2

2.1程序模块结构图2

2.2服务器端模块说明2

2.2.1图形界面模块2

2.2.2按钮监听及处理模块3

2.2.3启动通信线程模块3

2.2.4核心处理模块3

2.2.5通信线程模块3

2.3客户端模块说明3

2.3.1启动模块说明3

2.3.2图形界面模块说明3

2.3.3网络数据读取线程模块说明3

2.3.4按键监听及处理模块说明3

3详细设计4

3.1服务器端的实现4

3.1.1图形界面模块的实现4

3.1.2按钮监听及其处理模块的实现6

3.1.3启动通信线程模块的实现7

3.1.4核心处理模块模块的实现7

3.1.5通信线程模块的实现9

3.2客户端的实现12

3.2.1启动模块的实现12

3.2.2图形界面模块的实现14

3.2.3网络数据读取线程模块的实现18

3.2.4按键监听及处理模块的实现20

小结22

参考文献23

答辩记录24

1课程设计内容

1课程设计目的

使用图形用户界面和socket通信实现一个聊天程序。

多个不同的客户端连接在同一个服务器上,服务器端收到客户端发来的数据后,对数据进行一些简单的处理,再发给各个客户端,以实现各个客户端之间的聊天。

服务器端可以对通信的全过程进行实时监控,查看所有用户的当前状态。

同时服务器端的管理员可以根据实际情况的需要,强制断开与某个客户端的连接。

并且可以保存客户之前聊天的历史记录。

如果客户端遇到网络问题,临时断开与服务器的连接,下次登录时,客户依然能看到之前的历史记录。

2概要设计

2.1程序模块结构图

图2-1-1服务器端程序结构模块图

图2-1-2客户端程序结构模块图

2.2服务器端模块说明

2.2.1图形界面模块

这个模块实现整个服务端的图形用户界面。

它给服务端用户提供的一个实时监控平台,能实时显示当前的所有会话,以及网络传输中出现的错误。

便于用户管理整个系统。

2.2.2按钮监听及处理模块

这个模块用于实现图形界面中的按钮点击,以及列表框点击。

实现正真的用户交互。

2.2.3启动通信线程模块

这个模块专门用于实现当有新客户需要连接时,接收他的连接,同时开启一个新的线程,等待新用户的连接。

2.2.4核心处理模块

这个模块用于实现整个聊天程序的聊天功能。

当有需要的时候,这个模块负责将接收到的信息一个个转发个所有用户。

如果是私聊的状态,则将数据发送给所指定的用户。

2.2.5通信线程模块

这个模块用于实现服务器端与客户的连接。

并用于等待用户发送信息。

2.3客户端模块说明

2.3.1启动模块说明

这个模块用于输入用户信息,以及服务器信息,并以此启动客户端主程序。

2.3.2图形界面模块说明

这个模块用于显示所有的消息。

包括群消息,和个人。

两种不同的消息在不同类型的界面中显示。

同时能够显示当前网络中聊天的所有用户。

2.3.3网络数据读取线程模块说明

这个模块用于实现读取网络消息。

该模块出于长期等待状态,直到有数据发送到当前端口,该模块接收到数据后,继续等待服务端发送下一组数据。

2.3.4按键监听及处理模块说明

这个模块用于监听用户按下的按键,并对此进行处理。

3详细设计

3.1服务器端的实现

3.1.1图形界面模块的实现

在启动时会先弹出对话框,提示输入要启用的端口号。

然才会进入程序的主界面。

主界面采用BorderLayout布局管理器。

北部为一个用于显示网络中错误信息的List框。

西部是一个用于显示当前所有用户及其详细信息的JTable表格。

在南部是一个放有JTextField和两个JButton的JPanel。

而中部则是一个用于显示聊天消息的JTextArea。

以上过程的主要实现代码如下:

classserwin{

JFramejf;

JTablejt;

JTextAreajta;

JButtondiscon;

JButtontalk;

JScrollPanejsp,jsp2;

DefaultTableModeldft;

JTextFieldjtf;

Listerrorlist;

//intportx;

nettsernetserx;

serwin(){

//this.portx=portx;

jf=newJFrame("网聊服务端");

Containerjc=jf.getContentPane();

jt=newJTable();

dft=(DefaultTableModel)jt.getModel();

dft.addColumn("序号");

dft.addColumn("用户名");

dft.addColumn("IP地址");

dft.addColumn("端口号");

jt.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

jsp=newJScrollPane(jt);

talk=newJButton("发送");

discon=newJButton("强制断开用户连接");

jta=newJTextArea(25,40);

jsp2=newJScrollPane(jta);

jtf=newJTextField(60);

jc.add(jsp,BorderLayout.WEST);

jc.add(jsp2,BorderLayout.CENTER);

JPaneljp=newJPanel();

jp.add(jtf);

jp.add(talk);

jp.add(discon);

jc.add(jp,BorderLayout.SOUTH);

errorlist=newList(5);

jc.add(errorlist,BorderLayout.NORTH);

jf.pack();

jf.setVisible(true);

jf.setLocation((int)Toolkit.getDefaultToolkit().getScreenSize()

.getWidth()

/2-(int)jf.getWidth()/2,(int)Toolkit

.getDefaultToolkit().getScreenSize().getHeight()

/2-(int)jf.getHeight()/2);

jf.addWindowListener(newwinlistener());

talk.addActionListener(newsentmes());

discon.addActionListener(newsmdel());

jtf.requestFocus();

jf.getRootPane().setDefaultButton(talk);

Stringportx=JOptionPane.showInputDialog("服务端口:

");

netserx=newnettser(Integer.valueOf(portx));

netserx.doing();

}

图形界面如下图3-1-1,图3-1-2所示:

图3-1-1服务器端图形界面1

图3-1-2服务端图形界面2

3.1.2按钮监听及其处理模块的实现

当用户按下发送按钮时,程序会判断输入框内是否为空,如果不为空就把它发送给所有的用户,并加入历史记录总。

当用户按下强制断开用户连接时,程序会判断是否选中某个用户。

如果已经选中,则开始断开与改用户的连接。

并向所有用户发送消息,告知改用已经被管理员断开连接。

以上过程主要实现代码如下:

classsmdelimplementsActionListener{

publicvoidactionPerformed(ActionEventarg0){

if(jt.getSelectedRow()==-1)

JOptionPane.showMessageDialog(jf.getContentPane(),

"请选中要断开连接的用户","错误",JOptionPane.ERROR_MESSAGE);

else{

SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

Stringuserdel=netserx.tdlist.get(jt.getSelectedRow()).name;

netserx.tdlist.get(jt.getSelectedRow()).write("#exit#");

try{

Thread.sleep(500);

//netserx.thxd.suspend();

//netserx.tdlist.remove(jt.getSelectedRow());

//netserx.thxd.resume();

for(inti=0;i

netserx.tdlist.get(i).write(

timex+"管理员:

\n"+userdel+"已经被管理员提出\n\n");

}

jta.setText(netserx.history+timex+"管理员:

\n"+userdel

+"已经被管理员提出\n\n");

jta.selectAll();

jta.setCaretPosition(jta.getSelectedText().length());

}catch(InterruptedExceptione){

//e.printStackTrace();

//JOptionPane.showMessageDialog(jf.getContentPane(),"线程中断",

//"错误",JOptionPane.ERROR_MESSAGE);

errorlist.add(timex+"中断客户连接线程中断",0);

}

}

}

}

classwinlistenerextendsWindowAdapter{

publicvoidwindowClosing(WindowEventarg0){

System.exit(0);

}

}

3.1.3启动通信线程模块的实现

启动一个新客户线程,等待客户端连接。

当有客户端成功连入后,再启动一个新的线程,并在此进入等待客户端连接状态。

整个模块就是如此不断的循环添加新的客户。

以上过程主要实现代码如下:

classconserimplementsRunnable{

publicvoidrun(){

for(intix=0;;ix++){

System.out.println(ix);

tdlist.add(newchatx(ss));

newThread(tdlist.get(tdlist.size()-1)).start();

booleanwfalg=!

tdlist.get(tdlist.size()-1).accflag;

while(wfalg)

wfalg=!

tdlist.get(tdlist.size()-1).accflag;

}

}

}

3.1.4核心处理模块模块的实现

启动一个启动通信线程模块,同时不停的循环查询是否有客户端发送数据过来。

如果有,则判断接受到的数据是否含有“####”。

如果是,则将接收到的数据发给指定的客户端。

如果没有,则将接受到的数据发送给所有客户端。

同时判断是否有客户已经断开连接,如果有则将他从客户列表中移除。

上面的所有运行过程中一旦有任何错误,都将记录进错误信息列表中。

以上过程主要实现代码如下:

ArrayListtdlist;

ServerSocketss;

Stringhistory="";

Stringusers="#+#";

booleanwhileflag=true;

conserconserx;

Threadthxd;

nettser(intportx){

try{

ss=newServerSocket(portx);

tdlist=newArrayList();

}catch(IOExceptione){

SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

errorlist.add(timex+"开启端口出错",0);

}

}

voiddoing(){

conserx=newconser();

thxd=newThread(conserx);

thxd.start();

try{

Thread.sleep(500);

}catch(InterruptedExceptione1){

//JOptionPane.showMessageDialog(jf.getContentPane(),"进程中断",

//"错误",JOptionPane.ERROR_MESSAGE);

//e1.printStackTrace();

SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

errorlist.add(timex+"服务线程中断",0);

}

while(whileflag){

for(intj=0;j

if(tdlist.get(j).inflag==true){

if(tdlist.get(j).indat.indexOf("####")!

=-1){

String[]indatstrx=tdlist.get(j).indat.split("");

for(intjx=0;jx

if(tdlist.get(jx)pareTo(indatstrx[1])==0){

SimpleDateFormatdf=newSimpleDateFormat(

"yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

Stringoutdatstr=timex+"\n"

+indatstrx[2]+"\n\n";

tdlist.get(jx).write(

"####'"+tdlist.get(j).name+"'"

+outdatstr);

}

}

tdlist.get(j).inflag=false;

}else{

SimpleDateFormatdf=newSimpleDateFormat(

"yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

Stringdatx=timex+""+tdlist.get(j).name

+":

\n"+tdlist.get(j).indat+"\n\n";

history=history+datx;

jta.setText(history);

jta.selectAll();

jta.setCaretPosition(jta.getSelectedText().length());

for(intk=0;k

tdlist.get(k).write(datx);

tdlist.get(k).inflag=false;

}

}

}

if(tdlist.get(j).endflag==true){

thxd.suspend();

tdlist.remove(j);

thxd.resume();

}

}

}

try{

ss.close();

}catch(IOExceptione){

SimpleDateFormatdf=newSimpleDateFormat("yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

errorlist.add(timex+"关闭客户端出错",0);

}

}

3.1.5通信线程模块的实现

当有用户连接时连接他,然后进入循环等待客户端发送数据。

这个模块同时提供向客户端发送数据的方法。

以便于其他模块的直接调用。

上面的所有一旦出现任何异常,都会直接记录进错误信息列表中。

以上过程主要实现代码如下:

classchatximplementsRunnable{

Stringindat;

Stringname;

booleaninflag=false;

booleanflag=true;

booleanaccflag=false;

booleanendflag=false;

ServerSocketss;

Socketso;

OutputStreamos;

DataOutputStreamdos;

InputStreamis;

DataInputStreamdis;

chatx(ServerSocketss){

this.ss=ss;

}

voidwrite(Stringoutdat){

try{

dos.writeUTF(outdat);

users="#+#";

for(inti=0;i

dft.removeRow(i);

for(inti=0;i

users=users+"'"+tdlist.get(i).name;

String[]userdatx=newString[4];

userdatx[0]=String.valueOf(i);

userdatx[1]=tdlist.get(i).name;

userdatx[2]=tdlist.get(i).so.getInetAddress()

.toString();

userdatx[3]=String

.valueOf(tdlist.get(i).so.getPort());

dft.setRowCount(i);

dft.addRow(userdatx);

}

dos.writeUTF(users+"\n");

}catch(IOExceptione){

SimpleDateFormatdf=newSimpleDateFormat(

"yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

errorlist.add(timex+"网络传输出错,无法发送",0);

}

}

publicvoidrun(){

try{

so=ss.accept();

os=so.getOutputStream();

dos=newDataOutputStream(os);

is=so.getInputStream();

dis=newDataInputStream(is);

name=dis.readUTF();

write("已连接\n"+history);

accflag=true;

}catch(IOExceptione){

SimpleDateFormatdf=newSimpleDateFormat(

"yyyyMMddHH:

mm:

ss");

Stringtimex=df.format(newDate());

errorlist.add(timex+"连接客户端出错",0);

}

while(flag){

t

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

当前位置:首页 > PPT模板 > 其它模板

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

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