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

Java 如何在服务器的套接字线程之间建立通信,以便在客户端之间进行通信?,java,sockets,server,Java,Sockets,Server,因此,我正在尝试为我用java编写的一个国际象棋应用程序创建一个国际象棋服务器。我包含的两个类是启动TCPServerThreads的主类,这个类本身就是 我能够连接两个客户端,例如将它们的输入回显给它们,但我不知道如何在这两个线程之间交换信息。我试图将服务器输入从一个客户机转发到主类,或者直接转发到另一个客户机,以便更新客户机上的chess字段 这几乎是我第一次使用服务器,所以提前感谢您的耐心 这是我的主要课程: package Main; import java.io.IOExceptio

因此,我正在尝试为我用java编写的一个国际象棋应用程序创建一个国际象棋服务器。我包含的两个类是启动TCPServerThreads的主类,这个类本身就是

我能够连接两个客户端,例如将它们的输入回显给它们,但我不知道如何在这两个线程之间交换信息。我试图将服务器输入从一个客户机转发到主类,或者直接转发到另一个客户机,以便更新客户机上的chess字段

这几乎是我第一次使用服务器,所以提前感谢您的耐心

这是我的主要课程:

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;
            }
        }
    }
}