Java 如何在服务器的套接字线程之间建立通信,以便在客户端之间进行通信?
因此,我正在尝试为我用java编写的一个国际象棋应用程序创建一个国际象棋服务器。我包含的两个类是启动TCPServerThreads的主类,这个类本身就是 我能够连接两个客户端,例如将它们的输入回显给它们,但我不知道如何在这两个线程之间交换信息。我试图将服务器输入从一个客户机转发到主类,或者直接转发到另一个客户机,以便更新客户机上的chess字段 这几乎是我第一次使用服务器,所以提前感谢您的耐心 这是我的主要课程:Java 如何在服务器的套接字线程之间建立通信,以便在客户端之间进行通信?,java,sockets,server,Java,Sockets,Server,因此,我正在尝试为我用java编写的一个国际象棋应用程序创建一个国际象棋服务器。我包含的两个类是启动TCPServerThreads的主类,这个类本身就是 我能够连接两个客户端,例如将它们的输入回显给它们,但我不知道如何在这两个线程之间交换信息。我试图将服务器输入从一个客户机转发到主类,或者直接转发到另一个客户机,以便更新客户机上的chess字段 这几乎是我第一次使用服务器,所以提前感谢您的耐心 这是我的主要课程: package Main; import java.io.IOExceptio
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();
}
}
}
多谢各位!我让tcp线程实现runnable而不是extend线程。然后,我在主线程和TCPThreads之间添加了一个ConnectionManager,它不是静态的。通过这种方式,我可以将管理器放入TCPThreads构造函数中,并在其对象之间进行通信。您不会在“线程之间”进行通信。您可以在对象之间进行通信。附带问题:你们为什么要扩展线程?你几乎从来都不想这样做。那么我应该用什么方式来改变这件事呢?通常我会将主类传递到构造函数中,但它当然是静态的,所以这不起作用。我正在扩展线程,因为我不知道如何控制流内和流外。谢谢你的建议。编辑:我将尝试实现runnableYou不需要在线程或对象之间进行通信。您只需要通过适当的同步直接写入各种“Sockets”。@isoflorne:这似乎过于简化了,尤其是当客户端运行GUI时。通常,客户端发送到服务器的数据是在客户端的主线程上完成的,但是从服务器读取数据将需要使用后台线程和对象之间的通信,因为客户端将包含多个对象(即使其中一个是匿名的内部类类型对象)@Maihoo:你的问题是如何连接多个客户端和一个服务器,同时考虑线程,例如,在这个网站和其他网站上,有很多这样的例子。另外,在我对Marquis的评论中没有提到的是,服务器将使用helper对象来表示每个客户机,它们将在线程中运行
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;
}
}
}
}