网站首页> 文章专栏> java解决多线程服务器网络编程问题
java解决多线程服务器网络编程问题
路人王 天津 90 0 0

一、案例:实现多客户端连接服务器

1.1 客户端代码

public class Client {

	public static void main(String[] args) throws Exception {
		Socket client = new Socket("localhost",8888);
		
		// 用户输入
		Scanner keyScan = new Scanner(System.in);
		// 接收服务器的信息
		Scanner netScan = new Scanner(client.getInputStream());
		netScan.useDelimiter("\n");
		PrintStream netOut = new PrintStream(client.getOutputStream());
		boolean flag = true;
		while(flag) {
			System.out.println("请输入要发送的信息:");
			String str= null;
			if(keyScan.hasNext()) {
				str = keyScan.next().trim();
				// 发送到服务器
				netOut.println(str);
				// 服务器端有回应
				if(netScan.hasNext()) {
					System.out.println(netScan.next());
				}
			}
			if("byebye".equals(str)) {
				flag = false;
				break;
			}
		}
		keyScan.close();
		netScan.close();
		client.close();
	
	}

}

1.2 单线程服务器端代码【仅支持一个客户端】

public class SingleThreadServer {

	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8888);
		// 等待连接
		Socket client = server.accept();
		// 接受客户端的输入
		Scanner scan = new Scanner(client.getInputStream());
		scan.useDelimiter("\n");
		// 对客户端的回应
		PrintStream out = new PrintStream(client.getOutputStream());
		boolean flag = true;
		while(flag) {
			// pandaUN客户达UN是否是有数据
			if(scan.hasNext()) {
				// 防止有空格出现
				String str = scan.next().trim();
				if("byebye".equals(str)) {
					out.println("byebye!!!");
					// 退出循环
					flag = false;
					break;
				}
				// 做出回应
				out.println("Server:"+str);
			}
		}
		out.close();
		scan.close();
		server.close();
	}

}

1.3 多线程服务器端代码【支持多客户端】

public class MultiThreadServer {
	
	public static class MyThread implements Runnable{
		private Socket client;
		public MyThread(Socket client) {
			this.client = client;
		}

		@Override
		public void run() {
			
			try {
			// 接受客户端的输入
			Scanner scan = new Scanner(client.getInputStream());
			scan.useDelimiter("\n");
			// 对客户端的回应
			PrintStream out = new PrintStream(client.getOutputStream());
			boolean flag = true;
			while(flag) {
				// pandaUN客户达UN是否是有数据
				if(scan.hasNext()) {
					// 防止有空格出现
					String str = scan.next().trim();
					if("byebye".equals(str)) {
						out.println("byebye!!!");
						// 退出循环
						flag = false;
						break;
					}
					// 做出回应
					out.println("Server:"+str);
				}
			}
			out.close();
			scan.close();
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
		
	}
	
	public static void main(String[] args) throws IOException {
		ServerSocket server = new ServerSocket(8888);
		
		// 无限的接受客户端的请求
		boolean flag = true;
		
		while(flag) {
			// 等待连接
			Socket client = server.accept();
			// 开启线程  多线程服务器
			new Thread(new MyThread(client)).start();
		}
		server.close();
	}

}
java  

评论

评论  分享  打赏