简体   繁体   English

Java套接字处理多个客户端

[英]Java socket handle multiple clients

I have a server and a client the client already connects successfully to the server even if i start another client it connects successfully and here is my problem the clients can send data to the server (its basically only a string)the server gets the data of both clients but the clients only get their own data back and i would like to have that both clients get the same data from the server back. 我有一个服务器和一个客户端,即使我启动另一个成功连接的客户端,客户端也已经成功连接到服务器,这是我的问题,客户端可以将数据发送到服务器(基本上只是一个字符串),服务器获取这两个客户端,但客户端仅返回自己的数据,我希望两个客户端从服务器返回相同的数据。

Server: 服务器:

public class Server extends Application {

@Override
public void start(Stage primaryStage) {

}

static ServerSocket serverSocket;
static Socket socket;
static DataOutputStream out;
static DataInputStream in;
static Users[] user = new Users[10];



public static void main(String[] args) throws IOException {
    System.out.println("Starting server...");
    serverSocket = new ServerSocket(7777);
    System.out.println("Server started");
    while(true){
    socket = serverSocket.accept();
    for(int i = 0;i < 10; i++){
    System.out.println("Connection from:" + socket.getInetAddress());
    out = new DataOutputStream(socket.getOutputStream());
    in = new DataInputStream(socket.getInputStream());

    if(user[i] == null){
        user[i] = new Users(out,in,user);
    Thread thread = new Thread(user[i]);
    thread.start();
    break;
            }  
}
}
}

private static class Users implements Runnable{

DataOutputStream out;
DataInputStream in;
Users[] user = new Users[10];
String name;

public Users(DataOutputStream out,DataInputStream in,Users[] user){
    this.out = out;
    this.in = in;
    this.user = user;

}



@Override
public void run() {
    while(true){
        try {
            String recievingData = in.readUTF();
            System.out.println(recievingData);
            out.writeUTF(recievingData);

        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}}}

Client(both are the same): 客户(都是一样的):

public class ServerClient {

static Socket socket;
static DataInputStream in;
static DataOutputStream out;

public ServerClient() throws IOException{
    System.out.println("Connecting");
    socket = new Socket("localhost",7777);
    System.out.println("Connecting succesful");
    in = new DataInputStream(socket.getInputStream());
    out = new DataOutputStream(socket.getOutputStream());
    System.out.println("Recieving");

    Input input = new Input(in);
    Thread thread = new Thread(input);
    thread.start(); 



}

public static void UploadPos(){
    try {
        out.writeUTF("TEST");

    } catch (IOException ex) {
        Logger.getLogger(ServerClient.class.getName()).log(Level.SEVERE, null, ex);
    }
}}


class Input implements Runnable{

DataOutputStream out;
DataInputStream in;

public Input(DataInputStream in){
    this.in = in;
}

@Override
public void run() {
   while(true){
       try {

           String data = in.readUTF();
           System.out.println(data);

       } catch (IOException ex) {
           Logger.getLogger(Input.class.getName()).log(Level.SEVERE, null, ex);
       }

   }

}}

Create a list of output streams. 创建输出流列表。

List<DataOutputStream> clientOuts = new ArrayList<>();

after

out = new DataOutputStream(socket.getOutputStream());

add

clientOuts.add(out);

then replace 然后更换

out.writeUTF(recievingData);

with

for(DataOutputStream cout :clientOutputs) {
     cout.writeUTF(recievingData);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM