课程设计报告Word下载.docx
- 文档编号:18435422
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:36
- 大小:251.15KB
课程设计报告Word下载.docx
《课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《课程设计报告Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
在这个程序中我们用到的是java.lang.Object中的BorderLayout来设置布局,使用这个布局管理方式我们只需要设置North,South,Center来设置我们的程序的窗口的布局。
在本程序中,我们还用到了importjava.awt和importjava.awt.event的TextField和Button的GUI的组件。
初始化数据对象和构造用户界面;
用户随时可以输入自己的喜欢的名字;
创建用于监听的ServerSocket;
If(监听线程对象==NULL)
{
启动监听线程;
}
If(监听线程启动)
监听连接请求;
If(有连接请求)
{
启动一个新线程,监听其他的连接请求;
接受连接请求;
If(连接并且握手成功)
语音提示;
根据用户输入的信息和点击发送按钮事件,发数据;
随时接受已经连接的客户机的数据,并显示;
If(客户机退出)
复位系统;
提示用户,并且监听其他的连接请求;
}
If(用户发送bye信息或者直接退出程序)
关闭stream和Socket;
退出;
}elseif(有其他用户发出连接请求)
{
显示发送连接请求的用户的用户信息;
通知呼叫用户服务器正忙,稍后再试;
java列表说明各类模块的功能及成员变量和成员方法的作用:
服务器程序:
ClassLanServerTalk;
这个程序中设置了服务器程序的run方法,其中的init方法使用BorderLayout设置了本程序的界面的布局。
用Thread来设置了连接线程和监听进程。
当程序中收到或者发送“bye”字符时退出程序。
并全还设置了这种端口关闭方法。
ClassListenOther;
这个类是设置了专门用于监听其他用户连接时发送提示忙信息的类,并且还设置了退出是这种端口设置的关闭。
ClassServerTalkCanvas;
这个类很重要,设置了“显示消息区”的信息的更新方法。
若程序的消息区没有满则讲消息直接写到消息区,若消息区满了,就重写整个消息区。
ClassServerSendCtl;
这个类设置了当点击发送按钮的时候所需要完成的事件。
ClassServerNameCtl;
这个类用来给程序中的用户设置一个名字。
客户机程序:
ClassLanClientTalk;
这个类设置了run方法,和服务器程序中的LanServerTalk对应,而且实现的功能也是类似的。
ClassClientTalkCanvas;
设置了“显示消息区”的信息的更新方法。
ClassClientSendCtl;
ClassClientConnectCtl;
这个类中设置了点击呼叫主机和连接按钮时需要做的工作。
程序清单:
/**目的:
用于通信的服务器端
作者:
刘文,廖志威,陈明
时间:
2010年10月~2010年11月
*/
importjava.io.*;
import.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.applet.AudioClip;
importjava.applet.Applet;
publicclassLanServerTalkextendsAppletimplementsRunnable
{
/**
*
privatestaticfinallongserialVersionUID=1L;
ServerTalkCanvasserverTalkCanvas;
//显示对话信息的对象
ServerSendCtlserverSendCtl;
//发送信息的用户接口的对象
ServerNameCtlserverNameCtl;
//更改服务器名称的用户接口的对象
ListenOtherlistenOther;
//监听其他用户连接请求的对象
privateServerSocketlistenSocket=null;
//监听用的socket
privatePrintWriteranswerSend=null;
//发送数据的对象
privateBufferedReaderanswerReceive=null;
//接受数据的对象
publicintSERVER_PORT=3210;
//监听端口
publicintMAX_CLIENTS=20;
//最大的请求数
publicbooleanKeepRunning=true;
//监听进程的运行标
privatestaticfinalbooleanAUTOFLUSH=true;
//printwriter的autoflush标志
privateAudioClipaudio;
//声音提示
@SuppressWarnings("
unused"
)
privatestaticStringdinfo="
"
;
//用于显示信息
privatestaticStringresponse="
//保存远程机器的信息
ThreadLanServerThread;
//服务器进程,用于监听连接以及通信
publicLanServerTalk()//初始化函数
{
try
{
listenSocket=newServerSocket(SERVER_PORT,MAX_CLIENTS);
//SERVER_PORT=3210,MAX_CLIENTS=20;
}catch(IOExceptionexcpt)
serverTalkCanvas.Display("
不能在这个端口成功监听:
+SERVER_PORT+"
:
+excpt);
System.exit
(1);
}//endofcatch
}//endofserver():
构造函数的结尾
publicvoidstart()//创建并启动用于监听的新进程的函数
if(LanServerThread==null)
LanServerThread=newThread(this);
LanServerThread.start();
}
}
publicvoidstop()//停止监听进程运行的函数
if(KeepRunning)
KeepRunning=false;
publicvoidinit()//初始化用户界面
setLayout(newBorderLayout());
serverTalkCanvas=newServerTalkCanvas();
add("
Center"
serverTalkCanvas);
serverSendCtl=newServerSendCtl(serverTalkCanvas);
South"
serverSendCtl);
serverNameCtl=newServerNameCtl(serverTalkCanvas);
North"
serverNameCtl);
resize(600,400);
audio=getAudioClip(getDocumentBase(),"
hi,au"
);
publicvoidrun()//-------run()函数:
接收请求并且用for实现通信的新进程
Stringnextline="
SocketforkSocket=null;
ThreadlistenOtherThread=null;
Thread.currentThread().setPriority(Thread.NORM_PRIORITY);
serverTalkCanvas.Display("
提示:
系统启动完成,正在监听连接"
如果没有输入用户名,缺省为LOCAL"
连接后,建议使用bye来借书通信"
while(KeepRunning)
{
if(!
ServerSendCtl.CONNECT)
{
forkSocket=listenSocket.accept();
answerReceive=newBufferedReader(newInputStreamReader(forkSocket.getInputStream()));
answerSend=newPrintWriter(forkSocket.getOutputStream(),AUTOFLUSH);
if(answerSend!
=null&
&
answerReceive!
=null)
{
ServerSendCtl.CONNECT=true;
audio.play();
}
if(listenOtherThread==null&
ServerSendCtl.CONNECT)
listenOther=newListenOther(listenSocket,audio);
listenOtherThread=newThread(listenOther);
listenOtherThread.start();
}
ServerSendCtl.InfoSend.equals("
))
if(ServerSendCtl.CONNECT)
if(ServerSendCtl.InfoSend.equals("
bye"
{
answerSend.println("
通信结束,再见"
ServerSendCtl.CONNECT=false;
break;
}
elseif((forkSocket==null)||(answerSend==null)||(answerReceive==null))
serverTalkCanvas.Display("
不能发送信息"
else
answerSend.println(ServerSendCtl.InfoSend);
serverTalkCanvas.Display(ServerNameCtl.LOCAL_NAME+ServerSendCtl.InfoSend);
ServerSendCtl.InfoSend="
answerSend.println("
~!
@#$%^"
if(answerReceive.ready())
nextline=answerReceive.readLine();
if(!
nextline.equals("
)&
!
serverTalkCanvas.Display(nextline);
nextline="
if(nextline.equals("
serverTalkCanvas.Display("
用户可能退出了,发送的消息可能无法到达"
系统假如监听状态,可以接受用户的连接请求"
=null)answerSend.close();
if(answerReceive!
=null)answerReceive.close();
if(forkSocket!
=null)forkSocket.close();
listenSocket.close();
ServerSendCtl.CONNECT=false;
nextline="
try
listenSocket=newServerSocket(SERVER_PORT,MAX_CLIENTS);
}catch(IOExceptionexcpt)
serverTalkCanvas.Display("
不能在端口监听"
+SERVER_PORT+excpt);
System.exit
(1);
answerSend.println("
连接成功"
}
ListenOther.otherreceiveInfo.equals("
serverTalkCanvas.Display(ListenOther.otherreceiveInfo);
ListenOther.otherreceiveInfo="
}
IO故障"
if(answerSend!
=null)answerSend.close();
if(answerReceive!
=null)answerReceive.close();
if(forkSocket!
=null)forkSocket.close();
listenSocket.close();
System.exit(0);
结束通信是出现IO故障"
}
classListenOtherimplementsRunnable//当与一个远程机器连接后,监听其他的连接的请求
publicbooleanRunning=true;
//监听进程的运行标志
publicPrintWriterotherSend;
publicBufferedReaderotherReceive;
publicstaticStringotherreceiveInfo="
publicSocketotherforkSocket=null;
publicAudioClipaudio;
publicListenOther(ServerSocketlistenSocket,AudioClipaudio)
this.listenSocket=listenSocket;
this.audio=audio;
publicvoidstop()
if(Running)
Running=false;
publicvoidrun()//用于提示客户暂时不能进行通信,之后关闭连接
Stringdinfo="
while(Running)
try
otherforkSocket=listenSocket.accept();
otherSend=newPrintWriter(otherforkSocket.getOutputStream(),AUTOFLUSH);
otherReceive=newBufferedReader(newInputStreamReader(otherforkSocket.getInputStream()));
otherreceiveInfo=otherReceive.readLine();
if(otherreceiveInfo!
=dinfo)
otherSend.println("
AgNreset"
dinfo=otherreceiveInfo;
可能正在与其他用户通信,请重试"
audio.play();
}catch(IOExceptionexcpt)
break;
}//endofcatch
if(otherSend!
=null)otherSend.close();
if(otherReceive!
=null)otherReceive.close();
if(otherforkSocket!
=null)otherforkSocket.close();
otherreceiveInfo="
结束监听其他用户的线程时"
+excpt;
classServerTalkCanvasextendsCanvas//用于以滚动的方式显示通信信息
privatefinalintrowhigh=25;
//每行25高
privateintrownum=25;
//在显示区同时显示的行数
privateintRectright,Rectbottom;
//显示区的右下角的坐标
privateintrowcurren=0;
//屏幕显示的当前韩式,当first=false,rowcurren始终显示为最后一行
privateStringdpinfo[];
//存放显示信息的字符串数组
privateboolean
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 报告