簡體   English   中英

將套接字連接到服務器並接收響應

[英]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類中進行的,盡管我輸入了http,但我正在嘗試使用TcpClient類與服務器進行對話,發送HTTP請求並打印出服務器發回的內容。請求,它只會解析它,然后變成空白。 任何幫助將非常感激。

您正在調用writeUTF()但沒有人在調用readUTF(). 這是任何人都會理解所寫內容的唯一方法。

但是該代理將不起作用。 創建初始連接后,每個連接需要兩個線程,一個線程在每個方向上進行讀寫。 您不能假設請求或響應是在一次讀取中讀取的,並且通常不能假設存在單個請求/響應對,或者根本不存在像請求或響應之類的東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM