【问题标题】:How do i establish communication between socket threads of server in order to communicate between clients?如何在服务器的套接字线程之间建立通信以便在客户端之间进行通信?
【发布时间】: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 的评论中没有提到服务器将使用帮助对象来表示每个客户端,并且它们将在线程中运行

标签: java sockets server


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-06-24
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    相关资源
    最近更新 更多