0

そこで、三目並べサーバーを実行する Server.jar ファイルを受け取りました。私が今やるべきことは、TCP Socket 経由でこのサーバーに接続し、HTTP リクエスト (例: "GET /game/ HTTP/1.1") を送信し、tictactoe フィールドを受信することです。

これで、サーバーに接続できるようになり、最初のリクエストも送信できるようになりました。ただし、2 番目の out.write は無視されるか、例外が発生するようです。理由がわかりません... サーバーが 2 番目のメッセージ/リクエストにも応答していないようです。

 Socket sock;
        try 
        {
            sock = new Socket("127.0.0.1",8080);
            System.out.println("Connection established at "+sock.toString());
            Scanner in = new Scanner(sock.getInputStream());//Step 2.

            PrintWriter out =new PrintWriter(sock.getOutputStream(),true);//Step 2.
            out.println("GET /game/ HTTP/1.1\nHost: 127.0.0.1\nConnection: keep-alive\n\n");        
            String test ="";            
            while( (in.hasNext())== true)       
            {        
                test = test + in.nextLine();        
            }

            System.out.println(test);
            //This one is ignored somehow.
            out.println("GET /game/gamenumber HTTP/1.1\nHost: 127.0.0.1\n\n");


            while( (in.hasNext())== true)       
            {        
                test = test + in.nextLine();        
            }



            System.out.println(test);

            out.close();
            sock.close();    




        }
        catch (IOException e)
        {
             System.out.println("Failed");
             e.printStackTrace();


        }

注: サーバーのソース コードに直接アクセスすることはできず、HTTPURLCONNECTION の使用は許可されていません。

4

2 に答える 2

1

java.net.SocketException: ソフトウェアにより接続が中止されました: ソケット書き込みエラー

これは通常、相手側ですでに閉じられている接続への書き込みが原因です。content-length ヘッダーを送信していないため、サーバーは最初のリクエストの後に接続を閉じました。

また、HTTP の行末記号は \n ではなく \r\n です。

HTTP 1.1 プロトコル RFC をよく調べる必要があります。または、HttpURLConnection を使用すると、完全に処理されます。これが宿題であり、HTTP 1.1 を自分で実装する必要がある場合を除き、奇妙に思えますが、実際にはこの問題のために設計された JDK の 1 つのクラスの使用を拒否するのも奇妙です。

于 2013-05-30T23:44:29.660 に答える
-2

各 println の後に out.flush() を追加してみてください。

于 2013-05-30T16:31:57.293 に答える