如何将数据发送到特定的 Socket 连接?

How do I send data to specific Socket connections?

我知道每个客户端都通过一个套接字连接,每个套接字都有一个新线程,但是如何将数据发送到特定的客户端套接字?我应该怎么做才能解决这个问题?这是我服务器的源代码:

package server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Server {
    public Server() throws IOException {
        ServerSocket ss = new ServerSocket(1124);
        ExecutorService executorService = Executors.newFixedThreadPool(100);
        System.out.println("Server is running");

        while (true) {
            Socket s = ss.accept();
            executorService.execute(new ConnectionHandler(s));    
        }    
    }

    public static void main(String[] args) throws IOException {
        new Server();
    }    
}

class ConnectionHandler implements Runnable {    
    Socket s;

    public ConnectionHandler(Socket s) {
        this.s = s;
    }

    @Override
    public void run() {    
        try {
            BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
            PrintWriter out = new PrintWriter(s.getOutputStream(), true);
        } catch (IOException ex) {
            Logger.getLogger(ConnectionHandler.class.getName()).log(Level.SEVERE, null, ex);
        }    
    }
}

您可以将连接到服务器的所有用户保存在一个链表中,并将其传递给每个客户端连接。这样你就可以遍历链表找到你想与之通信的连接并将数据发送到它的 outputstream.

编辑 示例-

服务器代码:

import java.io.IOException;
import java.net.Socket;
import java.net.ServerSocket;
import java.util.LinkedList;
import java.util.List;

public class DBServer {
    static boolean listening = true;
    private static ServerSocket serverSocket = null;
    private static Socket clientSocket = null;
    static List<ClientThread> users = null;

    public static void main(String[] args) {
    users= new LinkedList();
    int portNumber = 17000;
    System.out.println("Now using port number=" + portNumber);
    try {
        serverSocket = new ServerSocket(portNumber);
    } catch (IOException e) {
        System.out.println(e);
    }

    while (listening) {
        try {
            System.out.println("Number of users connected: " + users.size());
            clientSocket = serverSocket.accept();
            System.out.println("Someone just joined.");
            ClientThread ct= new ClientThread(clientSocket);
            users.add(ct);
            ct.start();
        }catch (IOException e) {
            System.out.println(e);
        }
    }
    }
}

服务器在 List<ClientThread> users 变量中维护一个已连接用户列表,客户端线程可以访问该列表。

ClientThread 代码:

public class ClientThread implements Runnable {
private Socket clientSocket = null;
ClientThread(Socket s){
    this.clientSocket= s; 
    //give this thead a unique identifier like a name using this.setName() method
}
void sendMessage(){
    for (ClientThread c : DBServer.users) {
        if(c.getName().equals(/*Name of thread you want to contact*/)){
            //send message here
        }
    }
}
}

使用this.setName() 方法设置线程名称。应该是唯一标识符。
现在您可以使用 users 变量与您想要的线程通信,并使用 getName() 方法遍历所有线程。