【问题标题】:Connecting two clients via server java通过服务器 java 连接两个客户端
【发布时间】:2013-11-28 17:25:32
【问题描述】:

大家好,我正在尝试通过服务器连接两个客户端,atm 每个客户端都连接到服务器并创建一个新线程,以便每个客户端都可以与服务器通信,但是我如何让两个客户端通过服务器进行通信?

服务器:

public void allowConnections(){
    int i = 0;
    try{
        while(true){                                                      
            new Thread(new TestT(draughtsSS.accept(),i )).start();         //listen for incoming connections    
            i++;
        }
    }
    catch(IOException e){
        System.out.println("Error :"+e.getMessage());
    }   
}


class TestT implements Runnable{

    Socket s;
    int gameNo;
    Scanner in;
    ObjectInputStream objectIn;  // for retrieving new color array (down s socket)
    ObjectOutputStream out;
    PrintWriter outPW;
    //String Player1;
    //String Player2;
    String playerIP;
    String opponentIP;
    int port = 50000;

    TestT(Socket s, int gameNo){
        this.s = s;
        this.gameNo = gameNo;
    }
    public void run(){

        try{
            outPW = new PrintWriter(s.getOutputStream(), true);
            out = new ObjectOutputStream(s.getOutputStream());
            out.writeObject(list);
            in = new Scanner(s.getInputStream());
            outPW.println("returnIP");                            ///get the IP of the client
            clientIPArray.add(in.nextLine());                     /// add it to the clientIPArray
        }
        catch(IOException e){
            e.getStackTrace();  
        }
        JOptionPane.showMessageDialog(new JFrame(), s.getInetAddress().toString() +" has connected.");              
        list[gameNo] = "Game "+Integer.toString(gameNo);
        gamesList.updateUI();   

        }
    }

}

    private void setupConnection(String serverIP, String port){
    int portInt = Integer.parseInt(port);
    serverIp = serverIP;
    try{
        IP = InetAddress.getByName(serverIP);
        clientSocket = new Socket(IP,portInt);
        JOptionPane.showMessageDialog(new JFrame(), "Successfully connected to Server");
        in = new ObjectInputStream(clientSocket.getInputStream());
        out = new PrintWriter(clientSocket.getOutputStream(), true);
        scanIn = new Scanner(clientSocket.getInputStream());
        a = (String[]) in.readObject();
        if(scanIn.nextLine().equals("returnIP"))out.println(clientIp);
        getGamesList(a);
        Thread tss = new Thread(new ClientThread());
        tss.start();
        System.out.println("w");
    }
    catch(Exception e){
        System.out.println("ErrorC :" +e.getMessage());
    }
}

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    建议:

    • 在服务器端保留几个缓冲区,在客户端输入时刷新它们并在另一个客户端连接时发送数据

    • 让服务器等待两个客户端连接,然后将每个SocketInputStream 重定向到另一个OutputStream

    • 让服务器等到两个客户端连接后,再传给两个客户端另一个的地址,让他们进行p2p通信(无服务器)

    • 以上任意组合

    最好的方法取决于你的目标。

    【讨论】:

    • 说到建议,我会用Thrift或其他成熟的框架来为你做脏活。
    • 感谢分享有用的链接!我认为这并不比在 java 上编写更容易,但我会牢记)
    • 感谢您的建议,现在我正在尝试接收一个数组,这是合法的吗? else if(Color[])objectIn.readObject() instanceof Color[]){ //做点什么}
    • (Color[]) 如果不是 Color[] 将抛出 ClassCastException。更好地拆分为 Object o=objectIn.readObject();if(o instanceof ...) 它真的与问题有关吗?
    • 但那将是一个对象而不是颜色[],上面的 if 语句似乎不起作用..我最好再问一个问题
    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多