gpt4 book ai didi

Java多人服务器阻塞io

转载 作者:行者123 更新时间:2023-11-29 09:22:48 24 4
gpt4 key购买 nike

我目前正在开发一款游戏的原型(prototype),我需要一个简单的服务器来运行它。在这个阶段,我不想花时间了解已经存在的所有不同的全功能多人游戏服务器(smartfox 等...)

我知道如何开发一个带有线程监听套接字的基本服务器,但我遇到了障碍。这是 Thread 的 run() 函数

public void run() {
try {
out = new PrintWriter(mSocket1.getOutputStream(), true);
in = new BufferedReader( new InputStreamReader( mSocket1.getInputStream() ) );
String inputLine1 = null, outputLine;

out.println("hello");
out.flush();

while( (inputLine1 = in.readLine()) != null) {
outputLine = mGameControl.processInput(mPlayerNum, inputLine1);
out.println(outputLine);
out.flush();
if(outputLine.contentEquals("bye"))
break;
}

Terminate();
}
catch(IOException e) { e.printStackTrace(); }
}

现在我的问题是线程被阻塞等待输入。我确实有其他类似的线程连接到其他客户端,这可能会导致信息被发送到所有客户端......

我如何修改它以便不同的线程可以与其交互并将信息推送到客户端?

最佳答案

只需编写一个同步公共(public)方法写入您的PrintWriter,并允许其他线程使用它向您的客户端发送消息。从您的读取循环中调用相同的方法以避免两个线程同时写入。

这是一个经过测试的例子:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;


public class SocketTest {
public static class Client implements Runnable {

private final BufferedReader in;
private final PrintWriter out;

public Client(Socket clientSocket) throws IOException {
out = new PrintWriter(clientSocket.getOutputStream(), true);
in = new BufferedReader( new InputStreamReader( clientSocket.getInputStream() ) );
}

public void run() {
send("Hello");
String inputLine1 = null, outputLine;
try {
while( (inputLine1 = in.readLine()) != null) {
outputLine = inputLine1.toLowerCase();
System.out.println(inputLine1);
send(outputLine);
if(outputLine.contentEquals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}

public synchronized void send(String message) {
out.println(message);
out.flush();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
ServerSocket s = new ServerSocket(5050);
Socket clientSocket = s.accept();
Client client = new Client(clientSocket);
Thread clientThread = new Thread(client);
clientThread.start();
int i = 1;
while (true) {
Thread.sleep(1000);
client.send("Tick " + (i++));
}
}

}

关于Java多人服务器阻塞io,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5175852/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com