当前位置:文档之家› java实现多线程的网络并发服务器

java实现多线程的网络并发服务器

课程设计说明书课程名称: 操作系统原理-课程设计课程代码:题目: 多线程的网络并发服务器设计年级/专业/班:学生姓名:学号:开始时间:2011 年12月11日完成时间:2011 年12月24 日课程设计成绩:指导教师签名:年月日目录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)I1 引言1.1 问题的提出在现代化的生活中,网络无处不在,那么是怎样来实现客户与服务器的通信的呢,服务器是怎样来实现处理不同客户端发来的请求,这就涉及到多线程的网络并发服务器的设计。

1.2国内外研究的现状传统的并发服务器往往是基于多进程机制的,每个客户一个进程,需要操作系统的干预,进程数目受操作系统的限制。

然而许多新型操作系统都是多线程,将并行服务器设计为多线程,可以增加其效率。

这样,不必为每个服务请求启动一个单独的进程或任务,多线程并行服务器可以启动一个执行速度更快的独立线程。

如果主机是多处理器的,则多线程并行服务器能够在多处理机上执行多个线程。

1.3任务与分析一个进程可以创建多个线程,线程与线程间的通信方式比较容易。

本设计主要是编写一个多线程的网络通信程序,不同的线程处理不同类型的消息,比如有专门处理TCP 的线程、专门处理UDP消息的线程等。

12程序的主要功能2.1客户端接收和发送消息功能客户端接与服务器建立连接,并且将从键盘输入的信息发送给服务器,客户端也能接收从服务器发来的消息并显示。

2.2服务器分配和回收序号功能为每一个连接到服务器的客户端分配一个唯一的序号。

并在断开连接时回收序号。

2.3服务器显示信息功能当没有客户端与服务器连接时,每隔一秒显示时间,当有客户端与服务器相连时处理客户端发来的数据,并显示。

23 程序运行平台WindowsJdk1.6Eclipse具体操作如下:打开服务器,导入现有java项目,名字为OS课程设计,在com 包中找到Main类,点击右键run as,选择java application。

在另一个工作空间打开客户端。

34 总体设计服务器端的设计:图4.1服务器的框架图客户端的设计:图4.2客户端的框架图45 程序说明Server类的声明public class Server{public static int number = 100;public static Resources resource = new Resources();ServerSocket server=null;DataInputStream in = null;DataOutputStream out = null;ServerThread serverThread = null;String mark0 = "**-Client1-**:";String mark1 = "**-Client2-**:";public Server(){try {server=new ServerSocket(4331);serverThread = new ServerThread();serverThread.setName("serverThread");serverThread.start();}catch(IOException e1) {System.out.println(e1);return;}while(true){try{System.out.println("服务器正在运行...");Socket you=null;you = server.accept(); //堵塞状态,除非有客户呼叫if(you != null && number > 0){System.out.println("接到客户端的请求!");DataInputStream in = new DataInputStream(you.getInputStream());DataOutputStream out = newDataOutputStream(you.getOutputStream());String mark = "";char c;while((c = in.readChar()) != '\n'){mark = mark + c;}out.writeChars("序号:" + number + "\n");if(mark.equals(mark0)){5Thread1 subThread = new Thread1(you);Thread dealWithClient1 = new Thread(subThread);dealWithClient1.start();number--;}else if(mark.equals(mark1)){Thread2 subThread1 = new Thread2(you);Thread dealWithClient2 = new Thread(subThread1);dealWithClient2.start();number--;}else{System.out.println("连接失败!");}}Thread.sleep(1000);}catch(Exception e) {System.out.println("客户已断开");break;}}}}Thread1类的声明public class Thread1 implements Runnable{Socket socket = null;DataOutputStream out = null;DataInputStream in = null;String str = null;String str2 = null;Scanner reader = new Scanner(System.in);char s;int i = 0;int f = 1;int number = -1;Thread1(Socket t){socket = t;number = Server.number;6}public void run(){while(f == 1){try{str = "";out = new DataOutputStream(socket.getOutputStream());in = new DataInputStream(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 (Exception e) {break;}if(str.equals("end")){try{socket.close();}catch(Exception ex){break;}}}catch(IOException ex){f = 0;Server.number ++;number = -1;Server.resource.give();}}System.out.println(Thread.currentThread().getName() + "终止!");}}ServerThread类的声明public class ServerThread extends Thread{int flag = 1;public void run(){while(true){Date date = new Date();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 (InterruptedException e){}}}}Client1类的声明public class Client1 {public static void main(String args[]){Socket mySocket = null;DataInputStream in = null;DataOutputStream out = null;int d = 0;String s = null;;String s2 = null;char c;Scanner reader = new Scanner(System.in);try{mySocket = new Socket("127.0.0.1", 4331);in = new DataInputStream(mySocket.getInputStream());out = new DataOutputStream(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(Exception ex){System.out.println("连接已经断开!");}}}6 模块分析6.1 客户端模块客户端先发送一个标志符,服务器分配一个序号给客户端,然后进行通信。

相关主题