【问题标题】:serversocket server + client issuesserversocket 服务器+客户端问题
【发布时间】:2012-02-27 21:33:15
【问题描述】:

好吧,我现在很难描述我的问题,但我会尽我所能,以便我得到一些帮助。

从技术上讲,我有一个 server.java 和 client.java 作为超类。我的服务器和客户端连接的布局结构是这样的

MAIN SERVER --- CLIENT/SERVER ----- CLIENT

我的主要问题是这个 CLIENT/SERVER 部分是 1 个驱动程序类,它调用 2 个不同的类,即 CLIENT 和 SERVER 一起......当我的 CLIENT 发送需要由 MAIN SERVER 端接收的东西时,这会产生问题需要通过 CLIENT/SERVER 部分。如果发生这种情况..

CLIENT 当然需要与 CLIENT/SERVER (SERVER) 部分进行交互,因为它是一个接受 CLIENT 数据的 SERVER。但现在我希望 CLIENT/SERVER 中的(SERVER)部分将数据传输到 CLIENT/SERVER 部分中的(CLIENT),以便可以将其发送到 MAIN SERVER

我怎么可能写一些东西让客户端/服务器相互交互,这样它就可以在它们之间传输数据,反之亦然?这是我用来同时调用 CLIENT 和 SERVER 的代码

public class Slave {
public static void main(String args []) throws IOException{
    try{
    // set Config file settings to slave mode   
    Config cfg = new Config("Slave");
    String MasterServerIP = cfg.getProperty("ServerIP");
    String MasterServerPort = cfg.getProperty("ServerPort");
    String SlaveServerPort = cfg.getProperty("ListeningPort");

    System.out.println("Slave Client connecting to Master Server");

    // start connect to master server by calling the SlaveClient class
    new SlaveClient(MasterServerIP,Integer.parseInt(MasterServerPort)).start();

    int numClient = 0;
    ServerSocket listener = new ServerSocket(Integer.parseInt(SlaveServerPort));
    System.out.println("Server starts running");

    try{
        while(true){
            // start listening to the server port by calling SlaveServer class
            new SlaveServer(listener.accept(), numClient++, Integer.parseInt(SlaveServerPort)).start();
        }
    } finally {
        listener.close();
    }

    } catch (FileNotFoundException file) {
        System.out.println("File Not Found Error: "+file.getMessage());
    }
}

}

以上只是调用SERVER和CLIENT端2个对象类的驱动类。

我将在此处附上我的 slaveserver 和 slaveclient 代码,但我不知道如何按照你说的那样做

 public class SlaveServer extends Server {
private JFrame frame = new JFrame();
private JTextArea msgArea = new JTextArea();
private JTextArea connectionArea = new JTextArea();

// SlaveServer Constructor
public SlaveServer(Socket socket, int numClient, int port) {
    super(socket, numClient, port);
}
   public void writeToMsg(String msg){
    msgArea.append(msg+"\n");
}

public void writeToConnection(String msg){
    connectionArea.append(msg+"\n");
}


 public void run(){
    try{
        startGUI();
        // initial BufferedReader and PrintWriter object by binding it with Socket
        BufferedReader in = new BufferedReader(new InputStreamReader(getSocket().getInputStream()));
        PrintWriter out = new PrintWriter(getSocket().getOutputStream(), true);

        // welcome message send from server to client
        out.println("Welcome to the Slave Server port:"+getPort()+" client #"+getNumClient());

        while(true){
            String readmsg = in.readLine();
            writeToMsg(readmsg);
        }

    } catch (IOException e){
        writeToMsg("Error in closing Socket");
    }
    writeToConnection("Connection from client #"+getNumClient()+" is closed");
}
 }






 public class SlaveClient extends Client{
private BufferedReader in;
private PrintWriter out;
private JFrame frame = new JFrame();
private JTextArea msgArea = new JTextArea();
private JTextArea connectionArea = new JTextArea();

// SlaveClient Constructor
public SlaveClient(String ip, int port) {
    super(ip, port);
}
 public void run(){
    startGUI();
    Socket sock = null;
    try {
        sock = new Socket(getIp(), getPort());
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        out = new PrintWriter(sock.getOutputStream(), true);
    } catch (IOException e) {
        e.printStackTrace();
    }

    out.println("TEST");

    // while loop for reading message from server
    while(true){
        try {
            getMsg(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
}

【问题讨论】:

    标签: java serversocket


    【解决方案1】:

    所以你正在尝试编写代理?

    您需要给代理的服务器端一个对客户端的引用,以便它可以转发数据。

    然后在客户端创建一个方法来接受来自服务端的消息。

    因此,您在服务器端读取的每条消息都会传递给客户端。然后客户端可以将其传递给真正的服务器。

    【讨论】:

    • 我建议你看一下writeToMsg()方法,它看起来像在Server超类中,我们看不到。您可能需要修改 SlaveClient 以发送“TEST”以外的内容。
    • 实际上我的 writeToMsg 与 nth 相关,因为它们只是来自 SlaveServer 的方法,我在上面没有提到,但这是我从上面的帖子中再次编辑的实际代码..它们只是方法我用来为我的 GUI 附加我的 JTextArea ......现在我还没有创建任何方法来发送数据,因为我想到了这个问题并找到了第一个解决方案......似乎很难
    猜你喜欢
    • 1970-01-01
    • 2011-05-26
    • 2016-03-30
    • 2011-06-06
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多