如何解决java socket server不能同时接收很多数据,如何让java socket server同时接收数据?
我的java socket服务器不能在一个客户端同时接受多个数据
let result = {
name: details.name,age: details.age,gender: details.gender,contactDetails: {
email: details.email,mobile: details.mobile
}
}
我尝试使用线程但它不起作用,此代码只接受第一个数据,否则另一个数据将被拒绝。服务器如何同时接受多个数据?
解决方法
让我告诉你我是怎么做的,在玩套接字的时候,所以我创建了一个 SocketServer 类
public class Server {
public static final Integer port = 9000;
private final ServerSocket server;
private final ExecutorService service = Executors.newFixedThreadPool(10);
private final AtomicInteger idGenerator = new AtomicInteger(0);
public Server() throws IOException {
this.server = new ServerSocket(port);
}
public void start() {
try {
while (true) {
Worker worker = new Worker(idGenerator.incrementAndGet(),server.accept());
service.execute(worker);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
现在每次有客户端加入时,我都会创建一个工作线程并将其提交给ExecutorService
(Executor 服务具有线程池并通过向其分配线程来运行传递的工作线程,您可以阅读它) .
工人类看起来像这样
public class Worker implements Runnable {
private final Socket client;
private final Logger log = LoggerFactory.getLogger(this.getClass());
public Worker(Integer id,Socket client) {
this.id = id; //Ignore it,it was for logging purpose,how many joined
this.client = client;
}
@Override
public void run() {
listenClientMessages();
closeConnection();
}
private void listenClientMessages() {
final int MAX_INPUT = 1024;
int read;
try (InputStream is = client.getInputStream()) {
byte[] buf = new byte[MAX_INPUT];
while ((read = is.read(buf)) != -1) {
String line = new String(buf,read);
log.info(line);
if (line.equals("bye")) break;
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
private void closeConnection() {
try{
client.close();
}catch (IOException ex) {
ex.printStackTrace();
}
}
}
所以,你可以看到,我正在一边看一边读取字节
byte[] buf = new byte[MAX_INPUT];
while ((read = is.read(buf)) != -1) {
String line = new String(buf,read);
log.info(line);
if (line.equals("bye")) break;
}
这就是为什么当处理 MAX_INPUT 或更少时,它会等待客户端发送下一个输入。
如果有帮助,请告诉我。
编辑:正如@user207421 在评论中所评论的那样,closeConnection
函数是多余的,因为输入流在 listenClientMessages
函数中用上面的 try-wit-resources 块关闭,所以它不需要。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。