【发布时间】:2020-07-20 04:35:23
【问题描述】:
所以我正在尝试为我用 java 编写的国际象棋应用程序创建一个国际象棋服务器。我包括的两个类是启动我的 TCPServerThreads 的主类和这个类本身。
我能够连接两个客户端,例如将它们的输入回显给它们,但我不知道如何在这两个线程之间交换信息。我正在尝试将服务器输入从一个客户端转发到主类,或直接转发到另一个客户端,因此我可以更新客户端上的国际象棋字段。
这几乎是我第一次使用服务器,所以提前感谢您的耐心等待。
这是我的主要课程:
package Main;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import TCP.TCPServerThread;
public class Main {
public static final String StopCode = "STOP";
public static final int PORT = 8888;
public static int count = 0;
public static void main(String[] args) {
ServerSocket serverSocket = null;
Socket socket = null;
//create Server Socket
try {
serverSocket = new ServerSocket(PORT);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("serverSocket created");
//accept client Sockets
while (count < 2) {
try {
socket = serverSocket.accept();
count ++;
System.out.println("socket Nr " + count + " accepted");
} catch (IOException e) {
System.out.println("I/O error: " + e);
}
// new thread for a client
new TCPServerThread(socket).start();
}
}
}
这是 TCPServerThread:
package TCP;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import java.sql.Timestamp;
import Main.Main;
public class TCPServerThread extends Thread{
Timestamp ts;
private int port = 0;
Socket socket;
public TCPServerThread(Socket clientSocket) {
this.socket = clientSocket;
}
public void run() {
InputStream is = null;
BufferedReader br = null;
DataOutputStream os = null;
try {
is = socket.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
os = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
return;
}
String line;
while (true) {
try {
line = br.readLine();
if ((line == null) || line.equalsIgnoreCase("QUIT")) {
socket.close();
return;
} else {
if(line.equalsIgnoreCase("sp") && this.activeCount() == 3) {
os.writeBytes("1" + "\n\r");
os.flush();
}
os.writeBytes("Echo reply: " + line + "\n\r");
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}
【问题讨论】:
-
您不会在“线程之间”进行通信。您在对象之间进行通信。附带问题:您为什么还要扩展 Thread?你几乎不想这样做。
-
那么我应该以什么方式改变这个东西呢? Normaly 我会将主类传递给构造函数,但它当然是静态的,所以这不起作用。我正在扩展线程,因为我不知道如何控制 inStream 和 outStream。不过感谢您的建议。编辑:我将尝试实现可运行
-
您不需要在线程或对象之间进行通信。您只需要直接写入各种 `Sockets,并进行适当的同步。
-
@MarquisofLorne:这似乎过于简单,尤其是在客户端运行 GUI 时。通常,客户端向服务器发送的数据是在客户端的主线程上完成的,但是从服务器读取将需要使用后台线程和对象之间的通信,因为客户端将包含多个对象(即使一个是匿名的)内部类类型对象)。
-
@Maihoo:您的问题是如何在尊重线程的同时连接多个客户端和服务器,并且在此站点和其他站点上有很多很好的示例,例如@987654321 @ 以及 these questions。另外,在我对 Marquis 的评论中没有提到服务器将使用帮助对象来表示每个客户端,并且它们将在线程中运行