2011-10-05 48 views
-1

我目前正在用java实现一个多线程代理服务器,它将接受来自客户端的消息,并将它们转发给另一个服务器,然后服务器会确认接收消息。但是,我遇到麻烦了。有人能指出我做错了什么吗?谢谢。在java中实现的多线程代理服务器

ProxyApp:

public class ProxyApp { 

    public static ServerSocket server = null; 
    public static Socket client = null; 


    public static void main(String[] args) 
    { 
     try 
     { 
      server = new ServerSocket(6789); 
      Socket clientsocket = null; 

      while(true) 
      { 
       client = server.accept();  

       if(client.isConnected()) 
       { 
        System.out.println("Proxy is currently listening to client on port 6789"); 
       } 
       Thread t1 = new ProxyHandler(client); 
       t1.start(); 

       clientsocket = new Socket(InetAddress.getLocalHost(), 6780); 
       if(clientsocket.isBound()) 
       { 
        System.out.println("Clientsocket successfully connected on port 6780"); 
       } 

       ProxyHandler t2 = new ProxyHandler(clientsocket); 
       t2.start();                
      } 
     } 
     catch(IOException io) 
     { 
      System.err.println("IOException: " + io.getMessage()); 
     } 
    } 
} 

ProxyHandler

public class ProxyHandler extends Thread { 

    private Socket socket; 
    private String message; 

    public ProxyHandler(Socket socket) 
    { 
     this.socket = socket;   
    } 

    @Override 
    public void run() 
    {  
     message = ""; 
     try 
     { 
      DataInputStream in = new DataInputStream(socket.getInputStream()); 
      DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 
      while(true) 
      { 
       message = in.readUTF(); 
       out.writeUTF(message); 

       System.out.println(message); 
      } 
     } 
     catch(IOException io) 
     { 
      System.err.println("IOException: " + io.getMessage()); 
      System.exit(2); 
     } 
    } 
} 

ClientClass:

public class ClientClass { 

    public static void main(String[] args) 
    { 
     try 
     { 
      Socket client = new Socket(InetAddress.getLocalHost(), 6789); 

      if(client.isBound()) 
      { 
       System.out.println("Successfully connected on port 6789"); 
      } 

      Scanner scanner = new Scanner(System.in); 

      DataInputStream inFromProxy = new DataInputStream(client.getInputStream()); 
      DataOutputStream outToProxy = new DataOutputStream(client.getOutputStream()); 

      while(true) 
      { 
       String message; 

       System.out.print("Enter your message: "); 
       message = scanner.next(); 

       outToProxy.writeUTF(message); 
       System.out.println(inFromProxy.readUTF()); 
      } 
     } 
     catch(IOException io) 
     { 
      System.err.println("IOException: " + io.getMessage()); 
      System.exit(2); 
     } 
    } 
} 

ServerClass:

public class ServerClass { 

    public static void main(String[] args) 
    { 
     try 
     { 
      ServerSocket server = new ServerSocket(6780); 

      if(server.isBound()) 
      { 
       System.out.println("Server successfully connected on port 6780"); 
      } 

      Socket client = null; 
      while(true) 
      { 
       client = server.accept(); 

       if(client.isConnected()) 
       { 
        System.out.println("Proxy is connected"); 
       } 

       DataInputStream inFromProxy = new DataInputStream(client.getInputStream()); 
       DataOutputStream outToProxy = new DataOutputStream(client.getOutputStream()); 

       System.out.println(inFromProxy.readUTF()); 

       outToProxy.writeUTF("Message has been acknowledged!"); 
      }  
     } 
     catch(IOException io) 
     { 
      System.err.println("IOException: " + io.getMessage()); 
      System.exit(2); 
     } 
    } 
} 
+3

-1您应该详细说明“这样做有问题。”期望SO用户在没有任何进一步信息的情况下查看这么多代码来寻找“你做错了什么”是不合理的。 –

回答

3

在下面的代码中进出,并在同一台机器代表消息:

DataInputStream in = new DataInputStream(socket.getInputStream()); 
DataOutputStream out = new DataOutputStream(socket.getOutputStream()); 

所以当你在读取和写入时,你正在做的正在创建一个回声服务。

message = in.readUTF(); 
out.writeUTF(message); 

对于代理,您希望从客户端读取并写入服务器,反之亦然。

看来你想要的东西更接近这个:

client = server.accept();  
    clientsocket = new Socket(InetAddress.getLocalHost(), 6780); 
    Thread t1 = new ProxyHandler(client, clientsocket); 
    t1.start(); 
    Thread t2 = new ProxyHandler(clientsocket, client); 
    t2.start(); 

在第一线的工作是从客户端发送数据到服务器和第二的工作是从服务器发送到客户端。

+0

它的工作!感谢提示! :) – Moshin