java实现多线程的网络并发服务器.docx
《java实现多线程的网络并发服务器.docx》由会员分享,可在线阅读,更多相关《java实现多线程的网络并发服务器.docx(16页珍藏版)》请在冰豆网上搜索。
![java实现多线程的网络并发服务器.docx](https://file1.bdocx.com/fileroot1/2022-11/27/a3ae2861-2fc1-4cd2-a2bf-f1af82f76ef0/a3ae2861-2fc1-4cd2-a2bf-f1af82f76ef01.gif)
java实现多线程的网络并发服务器
课程设计说明书
课程名称:
操作系统原理-课程设计
课程代码:
题目:
多线程的网络并发服务器设计
年级/专业/班:
学生姓名:
学 号:
开始时间:
2011年12月11日
完成时间:
2011年12月24日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月日
目录
1引言1
1.1问题的提出1
1.2国内外研究的现状1
1.3任务与分析1
2程序的主要功能2
2.1客户端接收和发送消息功能2
2.2服务器分配和回收序号功能2
2.3服务器显示信息功能2
3程序运行平台3
4总体设计4
5程序类的说明5
6模块分析10
6.1客服端模块10
6.2服务器模块10
6.3处理客户端线程的模块12
6.4服务器线程模块12
7系统测试13
8结论18
参考文献19
1引言
1.1问题的提出
在现代化的生活中,网络无处不在,那么是怎样来实现客户与服务器的通信的呢,服务器是怎样来实现处理不同客户端发来的请求,这就涉及到多线程的网络并发服务器的设计。
1.2国内外研究的现状
传统的并发服务器往往是基于多进程机制的,每个客户一个进程,需要操作系统的干预,进程数目受操作系统的限制。
然而许多新型操作系统都是多线程,将并行服务器设计为多线程,可以增加其效率。
这样,不必为每个服务请求启动一个单独的进程或任务,多线程并行服务器可以启动一个执行速度更快的独立线程。
如果主机是多处理器的,则多线程并行服务器能够在多处理机上执行多个线程。
1.3任务与分析
一个进程可以创建多个线程,线程与线程间的通信方式比较容易。
本设计主要是编写一个多线程的网络通信程序,不同的线程处理不同类型的消息,比如有专门处理TCP的线程、专门处理UDP消息的线程等。
2程序的主要功能
2.1客户端接收和发送消息功能
客户端接与服务器建立连接,并且将从键盘输入的信息发送给服务器,客户端也能接收从服务器发来的消息并显示。
2.2服务器分配和回收序号功能
为每一个连接到服务器的客户端分配一个唯一的序号。
并在断开连接时回收序号。
2.3服务器显示信息功能
当没有客户端与服务器连接时,每隔一秒显示时间,当有客户端与服务器相连时处理客户端发来的数据,并显示。
3程序运行平台
Windows
Jdk1.6
Eclipse
具体操作如下:
打开服务器,导入现有java项目,名字为OS课程设计,在com包中找到Main类,点击右键runas,选择javaapplication。
在另一个工作空间打开客户端。
4总体设计
服务器端的设计:
回收序号
分配序号
显示时间
服务器
图4.1服务器的框架图
客户端的设计:
接收消息
发送消息
客户端
图4.2客户端的框架图
5程序说明
Server类的声明
publicclassServer{
publicstaticintnumber=100;
publicstaticResourcesresource=newResources();
ServerSocketserver=null;
DataInputStreamin=null;
DataOutputStreamout=null;
ServerThreadserverThread=null;
Stringmark0="**-Client1-**:
";
Stringmark1="**-Client2-**:
";
publicServer(){
try{
server=newServerSocket(4331);
serverThread=newServerThread();
serverThread.setName("serverThread");
serverThread.start();
}catch(IOExceptione1){
System.out.println(e1);
return;
}
while(true){
try{
System.out.println("服务器正在运行...");
Socketyou=null;
you=server.accept();//堵塞状态,除非有客户呼叫
if(you!
=null&&number>0){
System.out.println("接到客户端的请求!
");
DataInputStreamin=newDataInputStream(you.getInputStream());
DataOutputStreamout=newDataOutputStream(you.getOutputStream());
Stringmark="";
charc;
while((c=in.readChar())!
='\n'){
mark=mark+c;
}
out.writeChars("序号:
"+number+"\n");
if(mark.equals(mark0)){
Thread1subThread=newThread1(you);
ThreaddealWithClient1=newThread(subThread);
dealWithClient1.start();
number--;
}elseif(mark.equals(mark1)){
Thread2subThread1=newThread2(you);
ThreaddealWithClient2=newThread(subThread1);
dealWithClient2.start();
number--;
}else{
System.out.println("连接失败!
");
}
}
Thread.sleep(1000);
}catch(Exceptione){
System.out.println("客户已断开");
break;
}
}
}
}
Thread1类的声明
publicclassThread1implementsRunnable{
Socketsocket=null;
DataOutputStreamout=null;
DataInputStreamin=null;
Stringstr=null;
Stringstr2=null;
Scannerreader=newScanner(System.in);
chars;
inti=0;
intf=1;
intnumber=-1;
Thread1(Sockett){
socket=t;
number=Server.number;
}
publicvoidrun(){
while(f==1){
try{
str="";
out=newDataOutputStream(socket.getOutputStream());
in=newDataInputStream(socket.getInputStream());
while((s=in.readChar())!
='\n'){
str=str+s;
}
System.out.print("序号:
"+number);
System.out.println("内容:
"+str);
str2="您好!
您的序号为:
"+number+'\n';
out.writeChars(str2);
try{
Thread.sleep(1000);
}catch(Exceptione){
break;
}
if(str.equals("end")){
try{
socket.close();
}catch(Exceptionex){
break;
}
}
}catch(IOExceptionex){
f=0;
Server.number++;
number=-1;
Server.resource.give();
}
}
System.out.println(Thread.currentThread().getName()+"终止!
");
}
}
ServerThread类的声明
publicclassServerThreadextendsThread{
intflag=1;
publicvoidrun(){
while(true){
Datedate=newDate();
Server.resource.give();
System.out.println("\n--------------------------------------------------------");
System.out.println("现在的时间是:
"+date+"序号:
"+Server.number);
System.out.println("服务器工作正常,没有客服端发来请求");
System.out.println("--------------------------------------------------------\n");
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
}
}
}
}
Client1类的声明
publicclassClient1{
publicstaticvoidmain(Stringargs[]){
SocketmySocket=null;
DataInputStreamin=null;
DataOutputStreamout=null;
intd=0;
Strings=null;;
Strings2=null;
charc;
Scannerreader=newScanner(System.in);
try{
mySocket=newSocket("127.0.0.1",4331);
in=newDataInputStream(mySocket.getInputStream());
out=newDataOutputStream(mySocket.getOutputStream());
out.writeChars("**-Client1-**:
\n");
s2="";
while((c=in.readChar())!
='\n'){
s2=s2+c;
}
System.out.println(s2);
while(true){
s="";
System.out.println();
s=s+reader.nextLine();
s=s+'\0';
out.writeChars(s);
s2="";
while((c=in.readChar())!
='\n'){
s2=s2+c;
}
System.out.println(s2);
}
}catch(Exceptionex){
System.out.println("连接已经断开!
");
}
}
}
6模块分析
6.1客户端模块
客户端先发送一个标志符,服务器分配一个序号给客户端,然后进行通信。
当客户端发送end的时候断开连接。
流程图如下:
发送消息
接收消息输出
发送客户标志
接收序号输出
结束
断开连接
连接到服务器
输入
开始
异常
异常
异常
图6.1.1客户端流程图
6.2服务器模块
接受客户端发来的请求,并根据不同的标志创建不同的线程进行处理。
输出”客户
端已断开”
休息1秒
结束
连接失败
回收序号
创建相应线程处理
接收客户端标志
可识别的标志
分配序号
Number>0
接收客户端
输出“服务器正常运行…”
建立服务器、创建服务器线程并启动
开始
流程图:
输出异常
图6.2.1服务器流程图
6.3处理客户端的线程模块
处理客户端发来的请求。
有两个线程第一个线程接受客户端的消息输出,并向客户端发送“hello,yourserialnumberis(分配到的序号)”,另一个线程发送“您好,您的序号为:
(分配到的序号)”。
6.4服务器线程模块
当没有客户端请求时,每隔一秒钟显示时间,但有客户端时阻塞,一直到没有客户端的请求时又显示。
7系统测试
首先进入eclipse,导入现有项目运行。
图7.1没有连接客户端时服务器
图7.2Client1连接到服务器
图7.3连接Client1后服务器显示
图7.4Client2连接到服务器
图7.5Client2连接后的服务器显示
图7.6断开Client1后的服务器显示
图7.7断开Client2后的服务器的显示
8结论
9.参考文献
[1]张尧学等,计算机操作系统教程第二版,北京清华大学出版社,2000.8
[2]汤子瀛等,计算机操作系统原理第四版,西安西安电子科技大学出版社,1996.12
[3]怀石工作室,LINUX上的C编程,中国电力出版社,2001.5
[4]HerbertSchildt,C语言大全,电子工业出版社,1995.2
[5]许合利等编著,C语言程序设计,中国矿业大学出版社,2007