2012-02-27 149 views
0

好吧,我现在很难描述我的问题,但我会尽我所能,以便我得到一些帮助。serversocket服务器+客户端问题

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

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

我的主要问题是这个CLIENT/SERVER部分是调用2个不同的类是客户端和服务器一起1个驱动类...这当我的CLIENT发送需要由MAIN SERVER端接收的内容需要通过CLIENT/SERVER部分时会产生问题。如果发生这种情况。

CLIENT当然需要与客户端/服务器(服务器)部分进行交互,因为它是接受CLIENT数据的服务器。但现在我希望CLIENT/SERVER中的(服务器)部分将数据传输到CLIENT/SERVER部分中的(CLIENT),以便它可以发送到主服务器

我怎么可能写允许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()); 
    } 
} 

代码}

上面只是调用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 2012-02-27 21:48:36

+0

我建议你看看writeToMsg()方法,它看起来像它在服务器超类中,我们看不到。您可能需要修改SlaveClient以发送其他“TEST”。 – DNA 2012-02-27 22:15:55

+0

其实我的writeToMsg是第n个相关的原因,他们只是来自SlaveServer的方法,我没有提到它上面,但这里是我从我的帖子再次编辑的实际代码..他们只是方法,我用来追加我的JTextArea为我的图形用户界面....现在我没有创建任何方法发送数据,但我想到这个问题,并找到一个解决方案第一..似乎很难 – user1217609 2012-02-27 22:25:48