如何在服务器的套接字线程之间建立通信,以便在客户端之间进行通信



所以我试图为我用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" + "nr"); 
os.flush();
}


os.writeBytes("Echo reply: " + line + "nr");
os.flush();
}
} catch (IOException e) {
e.printStackTrace();
return;
}
}
}
}

非常感谢!我使tcp线程实现为可运行的,而不是扩展线程。然后,我在main和TCPThreads之间添加了一个ConnectionManager,它不是静态的。通过这种方式,我可以将管理器放入TCPThreads构造函数中,并在其对象之间进行通信。

最新更新