用Java实现多线程服务器程序
1 package com.thread.demo; 2 3 import java.io.IOException; 4 import java.net.ServerSocket; 5 import java.net.Socket; 6 import java.util.Date; 7 8 public class ReceiveServer { 9 10 private final int server_port = 9090; 11 12 public ReceiveServer() { 13 ServerSocket serverSocket = null; 14 Socket request = null; 15 Thread receiveThread = null;//相应线程 16 try { 17 serverSocket = new ServerSocket(server_port);//初始化服务器 18 System.out.println("Welcome to the server!"); 19 System.out.println(new Date()); 20 System.out.println("The server is ready!"); 21 System.out.println("Port: "+server_port); 22 while(true) {//服务器需要一直监听 23 request = serverSocket.accept();//接收客户机请求 24 receiveThread = new Thread(new ReceiveThread(request));//创建响应线程 25 receiveThread.start();//启动线程 26 } 27 28 } catch (IOException e) { 29 e.printStackTrace(); 30 } 31 32 } 33 34 35 public static void main(String[] args) { 36 new ReceiveServer(); 37 } 38 }
1 package com.thread.demo; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.OutputStreamWriter; 7 import java.io.PrintWriter; 8 import java.net.Socket; 9 10 public class ReceiveThread implements Runnable { 11 Socket clientRequest; 12 //用户连接的通信套接字 13 BufferedReader input; //输入流 14 PrintWriter output; //输出流 15 public ReceiveThread(Socket s) 16 { //serverThread的构造器 17 this.clientRequest=s; 18 //接收receiveServer传来的套接字 19 InputStreamReader reader; 20 OutputStreamWriter writer; 21 try{ //初始化输入、输出流 22 reader=new InputStreamReader 23 (clientRequest.getInputStream()); 24 writer=new OutputStreamWriter 25 (clientRequest.getOutputStream()); 26 input=new BufferedReader(reader); 27 output=new PrintWriter(writer,true); 28 }catch(IOException e){ 29 System.out.println(e.getMessage());} 30 output.println("Welcome to the server!"); 31 //客户机连接欢迎词 32 output.println("Now is: "+new java.util.Date()+" "+ "Port:"+clientRequest.getLocalPort()); 33 output.println("What can I do for you?"); 34 output.println(clientRequest.getInetAddress()); 35 } 36 public void run(){ //线程的执行方法 37 String command=null; //用户指令 38 String str=null; 39 boolean done=false; 40 while(!done){ 41 try{ 42 str=input.readLine(); //接收客户机指令 43 }catch(IOException e){ 44 System.out.println(e.getMessage());} 45 command=str.trim().toUpperCase(); 46 if(str==null || command.equals("QUIT")) 47 //命令quit结束本次连接 48 done=true; 49 else if(command.equals("HELP")){ 50 //命令help查询本服务器可接受的命令 51 output.println("query"); 52 output.println("quit"); 53 output.println("help"); 54 } 55 else if(command.startsWith("QUERY")) 56 { //命令query 57 output.println("OK to query something!"); 58 } 59 //else if …….. //在此可加入服务器的其他指令 60 else if(!command.startsWith("HELP") && 61 !command.startsWith("QUIT") && 62 !command.startsWith("QUERY")){ 63 output.println("Command not Found! Please refer to the HELP!"); 64 } 65 }//end of while 66 try{ 67 clientRequest.close(); //关闭套接字 68 }catch(IOException e){ 69 System.out.println(e.getMessage()); 70 } 71 command=null; 72 }//end of run 73 }
启动该服务器程序后,可用telnet machine port命令连接,其中machine为本机名或地址,port为程序中指定的端口。也可以编写特定的客户机软件通过TCP的Socket套接字建立连接。

浙公网安备 33010602011771号