繁体   English   中英

客户端-服务器多线程

[英]Client-Server Multi-Threading

我在用Java实现简单的多线程服务器时遇到问题。

我的想法是让服务器向所有客户端广播消息(不使用多播)。

为此,我正在实现一种广播方法。 该方法将使用for循环,并循环遍历我存储在集合中的每个客户端线程。 它将调用每个线程send(),后者输出writeUTF()。

我的问题是2个客户A + B。

A输出:你好B输出:你好

B不会收到问候,并且当B再次键入时,它将收到A的消息。代码示例:

import java.net.*;

导入java.io。 ; 导入java.util。 ;

公共类ServerThreadHandler扩展了线程{

private AuctionServer       server          = null;
private Socket              socket          = null;
private String              name            = null;
private int                 ID              = -1;       
private DataInputStream     dataIn          = null;
public  DataOutputStream    dataOut         = null;
private Thread              thread;


protected static Vector handlers = new Vector();

// reason server is used here is because ian was calling a server method broadcast
// from inside the 
public ServerThreadHandler(AuctionServer server, Socket socket, String name) throws IOException{
    this.server = server;
    this.socket = socket;
    this.name   = name;

    dataIn = new DataInputStream( new
                            BufferedInputStream(socket.getInputStream()));

    dataOut = new DataOutputStream(socket.getOutputStream());       
}



// handles a specific client.
public void run(){

    System.out.println("Server running.."); 

    while(true){
        try{
            // broadcast to all clients. This will only be one client in this case.
            server.broadcast(dataIn.readUTF());

            int pause = (int)(Math.random() * 3000);
            Thread.sleep(pause);
        }
        catch(IOException e){
            System.out.println(e.getMessage());
        }
        catch(InterruptedException e){
            System.out.println(e.getMessage());
        }
    }

}

public void send(String msg){
    try{
        dataOut.writeUTF(msg);
        dataOut.flush();
    }
    catch(IOException e){

    }
}

服务器代码:

// broadcast this to clients.
public void broadcast(String msg){
        for(int i = 0; i < clientCount; i++){
            clients[i].send(msg);       
        }
}

客户[]在哪里

private ServerThreadHandler clients[] = new ServerThreadHandler[3];

我将给您一个大概的轮廓,您可以填写其余的详细信息:

public class Server {

    private ServerSocket serverSocket;
    private List<Socket> clientSockets;

    // constructor(s)

    private class ThreadTask implements Runnable {

        private Socket clientSocket;

        public ThreadTask(Socket clientSocket) {
            this.clientSocket = clientSocket;
        }

        @Override
        public void run() { 
             while(true) {      
                // read message from clientSocket
                for(Socket peerSocket: clientSockets) {
                    // send message on peerSocket
                }
             }
        }

    }

    private void acceptConnections() {
        while(true) {
            try {
                Socket clientSocket = serverSocket.accept();
                clientSockets.add(clientSocket);
                Thread t = new Thread(new ThreadTask(clientSocket));
                t.start();
            } catch (IOException e) {               
                e.printStackTrace();
            } 
        }
    }
}

暂无
暂无

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

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