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

网友投稿 292 2023-05-06


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 mhttp://sg = 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相关内容感兴趣的读者可查看本站专题:《Java Socket编程技巧总结》、《Java文件与目录操作技巧汇总》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》和《Java缓存操作技巧汇总》

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:vue2.0中click点击当前li实现动态切换class
下一篇:测试常用的mock数据工具(mock测试方法)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~