软件编程
位置:首页>> 软件编程>> java编程>> Java Socket实现多线程通信功能示例

Java Socket实现多线程通信功能示例

作者:kongxx  发布时间:2022-11-29 03:24:59 

标签:Java,Socket,多线程,通信

本文实例讲述了Java Socket实现多线程通信功能的方法。分享给大家供大家参考,具体如下:

前面的文章《Java Socket实现单线程通信的方法示例》说到怎样写一个最简单的Java Socket通信,但是文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后续Client不能再继续连接,所以需要做些改动,当Server没接受到一个Client连接请求之后,都把处理流程放到一个独立的线程里去运行,然后等待下一个Client连接请求,这样就不会阻塞Server端接收请求了。每个独立运行的程序在使用完Socket对象之后要将其关闭。代码如下:


package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
 public static void main(String[] args) throws IOException {
   ServerSocket server = new ServerSocket(10000);
   while (true) {
     Socket socket = server.accept();
     invoke(socket);
   }
 }
 private static void invoke(final Socket client) throws IOException {
   new Thread(new Runnable() {
     public void run() {
       BufferedReader in = null;
       PrintWriter out = null;
       try {
         in = new BufferedReader(new InputStreamReader(client.getInputStream()));
         out = new PrintWriter(client.getOutputStream());
         while (true) {
           String msg = in.readLine();
           System.out.println(msg);
           out.println("Server received " + msg);
           out.flush();
           if (msg.equals("bye")) {
             break;
           }
         }
       } catch(IOException ex) {
         ex.printStackTrace();
       } finally {
         try {
           in.close();
         } catch (Exception e) {}
         try {
           out.close();
         } catch (Exception e) {}
         try {
           client.close();
         } catch (Exception e) {}
       }
     }
   }).start();
 }
}

下面是Client程序代码:


package com.googlecode.garbagecan.test.socket.sample2;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class MyClient {
 public static void main(String[] args) throws Exception {
   Socket socket = new Socket("localhost", 10000);
   BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   PrintWriter out = new PrintWriter(socket.getOutputStream());
   BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
   while (true) {
     String msg = reader.readLine();
     out.println(msg);
     out.flush();
     if (msg.equals("bye")) {
       break;
     }
     System.out.println(in.readLine());
   }
   socket.close();
 }
}

测试,首先运行MyServer类,然后运行两个MyClient类,然后分别在每个MyClient的提示符下输入字符串,就可以看到Server可以分别接收处理每个Client的请求了。

希望本文所述对大家java程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com