将套接字连接到服务器并接收响应

Connecting Socket to Server and Receiving a Response

我正在编写一个简单的多线程 java 代理,但我似乎无法让服务器显示我所说的内容或发回任何内容。这是我的代码:

    import java.io.*;
    import java.net.*;

    public class TcpClient {

        public static void clientS( int portNumber, String request) throws Exception {
            String sentence = "";
            String modifiedSentence = "";

            System.out.println("In client class..");

            BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
            Socket clientSocket = new Socket("localhost", portNumber);
            DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());

            outToServer.writeUTF(modifiedSentence);
            System.out.println("What got written to the server: "+request);

            BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            sentence = inFromUser.readLine();
            outToServer.writeBytes(sentence + '\n');
            modifiedSentence = inFromServer.readLine();
            clientSocket.close();

            //TcpServerThread tcpThread = new TcpServerThread(clientSocket);
            //tcpThread.run();
        }//end method

    }// client class

    import java.net.Socket;
    import java.util.Scanner;
    import java.util.StringTokenizer;


    public class RequestParser extends TcpServerThread{

        static String method = "";
        static String endUrl = "";
        static String version = "";
        static String hostHeader = "";
        static String host = "";
        static String hostHeader1 = "";
        static String host1 = "";
        static String hostHeader2 = "";
        static String host2 = "";



        public RequestParser(Socket theSocket) {
            super(theSocket);
        }

        static int portNumber = 80;

        public int Request() {

            Scanner scan = new Scanner(System.in);
            System.out.println("Please type in your information, with headers separated by a space: ");
            String request = scan.nextLine();//stores the HTTP request

            //parses the HTTP request, gets port number if there is one
            try {
                portNumber = doFormattedMethodRequest(request);
                TcpClient.clientS(portNumber, request);
            } catch (Exception e) {
                e.getMessage();
            }
            return portNumber;

        }//end method

        public static int doFormattedMethodRequest(String unformattedRequest) throws Exception{


            System.out.println("In String Parser...");
            StringTokenizer tokenizer = new StringTokenizer(unformattedRequest," ");
            Scanner scan = new Scanner(System.in);

            //gets method, loops if there isn't correct input

            while (tokenizer.hasMoreElements()){


                method = (String) tokenizer.nextElement();
                System.out.println("method: "+method);
                if (!method.equals("GET")){
                    System.out.println("This program only supports GET requests");
                    System.out.println("Your method has been changed to GET");
                    method = "GET";
                }//end if

                endUrl = (String) tokenizer.nextElement();
                System.out.println("endUrl: "+endUrl);

                if(!endUrl.endsWith(".html")|| !endUrl.endsWith(".com")
                        || !endUrl.endsWith(".edu")||!endUrl.endsWith(".gov")||
                        !endUrl.endsWith(".net")||!endUrl.endsWith(".org")||
                        !endUrl.endsWith(".mil")){

                    String [] parts = endUrl.split("/");

                    for (int i=0;i<parts.length;i++){
                        host = "www."+parts[2];
                        if (parts[i].matches("/*[1-65535].*") == true){

                            String port = parts[i];
                            portNumber = Integer.parseInt(port);

                            System.out.println("Contains a port number");
                            System.out.println("Port Number is: "+portNumber);

                        }//end if   
                    }//end for loop
                }//end if


                version = (String) tokenizer.nextElement();
                System.out.println("version: "+version);
                if (!version.endsWith("1.0")){
                    System.out.println("This program only supports version of 1.0");
                    System.out.println("Your version has been changed to 1.0");
                    version = "1.0";
                }
                System.out.println("host: "+host);      

                hostHeader = (String) tokenizer.nextElement();
                host = (String) tokenizer.nextElement();
                hostHeader1 = (String) tokenizer.nextElement();
                host1 = (String) tokenizer.nextElement();
                hostHeader2 = (String) tokenizer.nextElement();
                host2 = (String) tokenizer.nextElement();


            }//end while loop               


            System.out.println("OK, here is what is being sent to the server...");
            System.out.print(method); System.out.print(" "+endUrl);
            System.out.println(" "+version);
            //System.out.print(hostHeader); System.out.println(host+endUrl);
            //System.out.print(hostHeader1); System.out.print(host);
            //System.out.println(hostHeader);System.out.println(host);

            return portNumber;



        }//end method

    }//end class

    import java.io.*;
    import java.net.*;

    class TcpServerThread extends Thread{

        static Socket connectionSocket = null;
        static int portNumber = 0;

        public TcpServerThread(Socket theSocket){
            super("TcpServerThread");
            TcpServerThread.connectionSocket = theSocket;
        }

        public static void main(String args[]) {

            System.out.println("Taking you to HTTP request input...");
            RequestParser estProxy = new RequestParser(connectionSocket);

            portNumber = estProxy.Request();//goes to get the user's http request
            System.out.println("");
            System.out.println("-----------------------------------------------------");
            System.out.println("System returned "+portNumber+" as the port number.");


            //create listener socket to listen for requests
            ServerSocket welcomeSocket;
            try {
                welcomeSocket = new ServerSocket(portNumber);
            System.out.println("");

            System.out.println("Listening on port number "+portNumber+"...");

            estProxy.run(); 

            boolean isListening = true;
            while (isListening) {
                new TcpServerThread(welcomeSocket.accept()).start();
            }//end while

            } catch (Exception e) {
                e.getMessage();
            }

        }//end method


        public void run(){
            System.out.println("Got into run method");

            Socket serverSocket = new Socket();
            Socket clientSocket = new Socket();

            try{
                InputStream inStream = clientSocket.getInputStream();
                byte [] buf = new byte[9000];

                int length = inStream.read(buf);

                System.out.println(new String(buf,0,length));   

                Socket socket= new Socket("localhost",portNumber);
                OutputStream outStream = socket.getOutputStream();
                outStream.write(buf,0,length);

                OutputStream inStream1 = clientSocket.getOutputStream();
                InputStream outStream1 = socket.getInputStream();
                for(int length1; (length1 = outStream1.read(buf)) != -1;){
                    inStream1.write(buf,0,length1);
                }

                inStream1.close();
                outStream1.close();
                outStream.close();
                inStream.close();
                socket.close();

            }
            catch(Exception e){
                e.getMessage();
            }
            finally{
                try{
                    clientSocket.close();
                }
                catch(IOException e){
                    e.getMessage();
                }
            }
        }//end method       
    }

我与服务器的大部分通信都发生在 TcpServerThread class 中,我正在尝试使用 TcpClient class 与服务器通信、发送 HTTP 请求并打印输出服务器发回的内容,虽然在我输入一个 http 请求后,它只解析它然后就变成空白了。任何帮助将非常感激。

您在呼叫 writeUTF() 但没有人在呼叫 readUTF(). 这是任何人都能理解所写内容的唯一方式。

但是这个代理不起作用。创建初始连接后,每个连接需要两个线程,一个用于在每个方向上读取和写入。您不能假设请求或响应是在单次读取中读取的,并且您通常不能假设有一个 request/response 对,或者根本没有任何类似请求或响应的东西。