gpt4 book ai didi

Java,使用套接字连接发送消息时出现问题

转载 作者:行者123 更新时间:2023-11-30 11:53:55 24 4
gpt4 key购买 nike

我的 Java 程序有问题。它在服务器和许多客户端之间有一个套接字连接。这是服务器(与问题有关的部分):

private static ArrayList<ParallelServer> clientConnected = new ArrayList<ParallelServer>();


public Server(int port) {
this.port = port;
if (!startServer())
JOptionPane.showMessageDialog(new JFrame(""),
"Error!", "ERROR!",
JOptionPane.ERROR_MESSAGE);
}

private boolean startServer() {
try {
server = new ServerSocket(port);
loadDatabase();
} catch (IOException ex) {
ex.printStackTrace();
return false;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return true;
}

public void runServer() {
while (true) {
try {
client = server.accept();
ParallelServer pServer = new ParallelServer(client);
clientConnected.add(pServer);
Thread thread = new Thread(pServer);
thread.start();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}


public static void sendBroadcast(String username) throws IOException {
for(int i = 0; i < clientConnected.size(); i++)
clientConnected.get(i).sendAnswer("@change," + username);
}

并行服务器是:

    private Socket client;
private InputStreamReader inputstreamreader;
private BufferedReader bufferedreader;
private PrintWriter printwriter;

public ParallelServer(Socket client) {
this.client = client;
}

public void run() {
try {
inputstreamreader = new InputStreamReader(client.getInputStream());
bufferedreader = new BufferedReader(inputstreamreader);
printwriter = new PrintWriter(client.getOutputStream(), true);
String lineread = "";

while (client.isConnected()) {
lineread = bufferedreader.readLine();
doCommand(lineread);
}
} catch (UnknownHostException unhe) {
} catch (InterruptedIOException intioe) {
} catch (IOException ioe) {
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

public void sendAnswer(String answer) throws IOException {
printwriter = new PrintWriter(client.getOutputStream(), true);
printwriter.println(answer);
printwriter.flush();
}

这是客户端:

private String serverurl = "localhost";
private int serverport = 7777;
private PrintWriter printwriter;
private InputStreamReader inputstreamreader;
private BufferedReader bufferedreader;
private Socket server;

public Client() {
server = null;
try {
server = new Socket(serverurl, serverport);
server.setSoTimeout(5000);
} catch (UnknownHostException unhe) {
System.out.println("UnknownHostException: " + unhe.getMessage());
} catch (InterruptedIOException intioe) {
System.out.println("Timeout while attempting to establish socket connection.");
} catch (IOException ioe) {
JOptionPane.showMessageDialog(new JFrame(),"Unable to reach the server!","ERROE!",JOptionPane.ERROR_MESSAGE);
}
}

public String sendCommand(String command) throws IOException {
if(server == null) {
try {
server = new Socket(serverurl, serverport);
server.setSoTimeout(5000);
} catch (UnknownHostException unhe) {
System.out.println("UnknownHostException: " + unhe.getMessage());
} catch (InterruptedIOException intioe) {
System.out.println("Timeout while attempting to establish socket connection.");
} catch (IOException ioe) {
JOptionPane.showMessageDialog(new JFrame(),"Unable to reach the server!","ERROR!",JOptionPane.ERROR_MESSAGE);
}
}
if(server != null) {
printwriter = new PrintWriter(server.getOutputStream(), true);
printwriter.println(command);
printwriter.flush();
inputstreamreader = new InputStreamReader(server.getInputStream());
bufferedreader = new BufferedReader(inputstreamreader);

return bufferedreader.readLine();
}
else
return "@serverProblem";
}

该程序是一个简单的轮流在线游戏。玩家的轮次是用队列创建的,当玩家轮到他时,服务器会发送一条广播消息说“现在轮到‘玩家 1’了。” (例如)。我的问题是,当客户端收到消息时,它会添加答案“现在轮到‘玩家 1’了。”到它将收到的下一条消息。在我的例子中:当玩家通过他的回合时,他发送“@passTurn,用户名”。 ParallelServer 类从队列中轮询它,将它放在队列底部,向客户端发送“@ok”,告诉它轮次更改成功,并告诉 Server 类发送广播消息。然后,当同一个客户端尝试做进一步的 Action 时,它会考虑“现在是‘玩家 1’回合”。作为服务器给它的答案。相反,我希望服务器和客户端一如既往地工作,当广播消息被咳嗽时,客户端会收到通知而没有任何附带影响。我能做些什么?谢谢。

最佳答案

您的双向消息传递机制应如下所示:

服务器:

Wait on any client InputStream
if (broadcast)
broadcast_message()
else
process_message()

客户:

Receiving Thread:
Wait on server broadcast

Sending Thread:
Wait on messages to be sent to server from the User Input

这应该可以解决问题:)

希望对您有所帮助。干杯!

关于Java,使用套接字连接发送消息时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012376/

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