【问题标题】:Multithreaded Proxy Server implemented in java用java实现的多线程代理服务器
【发布时间】:2011-10-05 15:45:56
【问题描述】:

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

代理处理程序:

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

客户端类:

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

服务器类:

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 您应该详细说明“这样做有困难”。期望 SO 用户在没有任何进一步信息的情况下查看这么多代码以寻找“您做错了什么”是不合理的。

标签: java proxy network-programming


【解决方案1】:

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

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

所以当您从 in 读取和写入到 out 时,您所做的就是创建一个 echo 服务。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 2015-02-10
    相关资源
    最近更新 更多