java 中的代理仅显示 1 个服务器回复

proxy in java only showing 1 server reply

我已经在下面发布了我的 java 代理代码。

它有效,但它只给我 1 个服务器响应,而不是所有响应。

在 1 次响应后,我只收到客户端发送的数据包,但大小为 0。

同时附上截图。

有什么想法吗?

我已经做了一些调试。如果我删除中间的所有内容

typ = streamFromServer.readUnsignedShort();

siz = streamFromServer.readUnsignedShort();
siz <<= 8;
siz |= streamFromServer.readUnsignedByte();

byte[] dat = new byte[siz];

streamFromServer.readFully(dat, 0, siz);

String FullHe = DatatypeConverter.printHexBinary(dat);

System.out.println("Server sending data to Client:");
System.out.println("Type:           " + typ + "");
System.out.println("Data Size:      " + siz + "");
System.out.println("Full Data:      " + FullHe + "");
System.out.println("\n\n");

这是从读取服务器响应代码开始的,我得到了客户端数据包。为什么它不适用于服务器数据包?

代码:

import java.io.*;
import javax.xml.bind.DatatypeConverter;
import java.net.*;

public class proxy{

    public static void main(String[] args) throws IOException {

    //PrintStream out = new PrintStream(new FileOutputStream("log.txt"));
    //System.setOut(out);

        try{
            String host = "gamea.clashofclans.com";
            int remoteport = 9339;
            ServerSocket ss = new ServerSocket(9339);
            int localport = ss.getLocalPort();
            ss.setReuseAddress(true);
            // Print a start-up message
            System.out.println("Starting proxy for " + host + ":" + remoteport
              + " on port " + localport);
            // And start running the server
            runServer(host, remoteport, localport,ss); // never returns
            System.out.println("Started proxy!");

        } catch (Exception e) {
            System.out.println("Failed to start proxy" +e+ "");
        }

    }

    public static void runServer(String host, int remoteport, int localport, ServerSocket ss)
    throws IOException {

    final byte[] request = new byte[2048];
    byte[] reply = new byte[4096];

        while (true) {
            Socket client = null, server = null;
            try {

                System.out.println("Waiting for Client");
                client = ss.accept();
                System.out.println("Client Accepted!");

                DataInputStream streamFromClient = new DataInputStream(client.getInputStream());
                DataOutputStream streamToClient = new DataOutputStream(client.getOutputStream());

                System.out.println("Connecting to server...");

                // Make a connection to the real server.
                server = new Socket("gamea.clashofclans.com", 9339);
                System.out.println("Just connected client to " + server.getRemoteSocketAddress());


                DataInputStream streamFromServer = new DataInputStream(server.getInputStream());
                DataOutputStream streamToServer = new DataOutputStream(server.getOutputStream());

                 Thread t = new Thread() {
                  public void run() {
                    int bytesRead;
                    int type;
                    int size;
                    int version;
                    try {
                      while ((bytesRead = streamFromClient.read(request)) != -1) {

                        type = streamFromClient.readUnsignedShort();

                        size = streamFromClient.readUnsignedShort();
                        size <<= 8;
                        size |= streamFromClient.readUnsignedByte();

                        version = streamFromClient.readUnsignedByte();

                        byte[] data = new byte[size];

                        streamFromClient.readFully(data, 0, size);

                        String FullHex = DatatypeConverter.printHexBinary(data);

                        System.out.println("Client sending data to server:");
                        System.out.println("Type:           " + type + "");
                        System.out.println("Data Size:      " + size + "");
                        System.out.println("Version:        " + version + "");
                        System.out.println("Full Data:      " + FullHex + "");
                        System.out.println("\n\n");

                        streamToServer.write(request, 0, bytesRead);
                        streamToServer.flush();
                      }
                    } catch (IOException e) {
                    }

                    // the client closed the connection to us, so close our
                    // connection to the server.
                    try {
                      streamToServer.close();
                    } catch (IOException e) {
                    }

                  }
                };

                t.start();

                int bytesRea;
                int typ;
                int siz;
                try {

                    while ((bytesRea = streamFromServer.read(reply)) != -1) {

                        typ = streamFromServer.readUnsignedShort();

                        siz = streamFromServer.readUnsignedShort();
                        siz <<= 8;
                        siz |= streamFromServer.readUnsignedByte();

                        byte[] dat = new byte[siz];

                        streamFromServer.readFully(dat, 0, siz);

                        String FullHe = DatatypeConverter.printHexBinary(dat);

                        System.out.println("Server sending data to Client:");
                        System.out.println("Type:           " + typ + "");
                        System.out.println("Data Size:      " + siz + "");
                        System.out.println("Full Data:      " + FullHe + "");
                        System.out.println("\n\n");

                        streamToClient.write(reply, 0, bytesRea);
                        streamToClient.flush();
                    }

                } catch (IOException e) {
                }



        } catch (IOException e) {
                System.err.println(e);
              } finally {
                try {
                  if (server != null)
                    server.close();
                  if (client != null)
                    client.close();
                } catch (IOException e) {
                }
              }
        }
    }

}

这没有意义。您正在从服务器读取最多 4096 个字节,然后 然后 读取两个类型字节和三个长度字节以及您认为是请求数据的内容,并写入您最初读取的内容。所以你消耗了大约两次数据。

这行不通。您需要 要么 只读取类型、长度和值, 并再次写出它们, 或者,更简单,只复制字节从输入到输出,在两个方向上。 (那样当然你不能做记录。)

注意不要忽略 IOExceptions,尤其是从 DataInputStreams(或 ObjectInputStreams)读取时不要忽略 EOFExceptions