2012-02-27 5 views
0

Мне сложно описать мою проблему сейчас, но тогда я постараюсь изо всех сил, чтобы я мог помочь.serverocket server + проблемы с клиентами

технически у меня есть server.java и client.java как суперкласс. и моя структура макета для моего сервера и клиента связи идет как этот

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

моя основная проблема заключается в этом КЛИЕНТА/СЕРВЕРА часть 1 класс драйвера, который вызывает 2 разных классов, является клиент и сервер вместе ... и это создает проблему, когда мой КЛИЕНТ отправляет то, что должно быть получено стороной MAIN SERVER, нужно пройти через часть CLIENT/SERVER. если это условие происходит.

КЛИЕНТ обязательно должен взаимодействовать с частью CLIENT/SERVER (SERVER), потому что является SERVER, который принимает данные CLIENT. но теперь я хотел, чтобы часть (СЕРВЕР) в КЛИЕНТЕ/СЕРВЕР передала данные в (КЛИЕНТ) в части КЛИЕНТ/СЕРВЕР, чтобы ее можно отправить в ГЛАВНЫЙ СЕРВЕР

как это возможно для меня написать что позволяет КЛИЕНТУ/СЕРВЕР взаимодействовать друг с другом, чтобы он мог передавать данные между ними наоборот? как всегда это мой код для вызова клиента и сервера вместе

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()); 
    } 
} 

}

выше только класс драйвера, который вызывает класс 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(); 
     } 
    } 
} 
} 

ответ

0

Таким образом, вы пытаетесь написать прокси-сервер?

Вам необходимо предоставить серверу половину прокси-сервера ссылку на клиентскую половину, чтобы она могла пересылать данные.

Затем создайте метод на половине клиента, чтобы принимать сообщения с половины сервера.

Итак, каждое сообщение, которое вы читаете на половине сервера, вы переходите к половине клиента. Затем клиентская часть может передать его реальному серверу.

+0

Я изменил свой вопрос с помощью кода SlaveClient и SlaveServer выше ... – user1217609

+0

Я предлагаю вам взглянуть на метод writeToMsg(), который выглядит так, как будто он находится в суперклассе Server, который мы не видим. Вероятно, вам нужно изменить SlaveClient, чтобы отправить что-то другое, что «TEST». – DNA

+0

на самом деле мой writeToMsg является n-й причиной, потому что это просто методы из SlaveServer, о которых я не упоминал выше, но вот вот фактический код, который я редактирую из своего сообщения выше. Это просто метод, который я использую для добавления JTextArea для моего графического интерфейса ... прямо сейчас я еще не создал какой-либо метод отправки данных, так как я думал об этой проблеме и нашел решение для нее. – user1217609

Смежные вопросы