用java实现的多线程代理服务器

时间:2011-10-05 15:45:56

标签: java proxy network-programming

我目前正在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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

以下代码中的in和out表示来自同一台机器的消息:

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

第一个线程的作业是将数据从客户端发送到服务器,第二个作业是从服务器发送到客户端。