【问题标题】:Writing to Socket Java doesn't work properly [closed]写入 Socket Java 无法正常工作 [关闭]
【发布时间】:2013-05-30 14:06:25
【问题描述】:

所以我得到了一个 Server.jar 文件,它运行一个井字游戏服务器。 我现在应该做的是通过 TCP Socket 连接到这个服务器,然后 发送 HTTP 请求(例如“GET /game/ HTTP/1.1”),并接收 tictactoe 字段。

现在我似乎能够连接到服务器,并且还发送了第一个请求。 然而,我的第二个 out.write 似乎要么被忽略,要么导致异常。 我不明白为什么...服务器似乎也没有响应第二条消息/请求。

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


        }

注意:我没有直接访问Servers Source Code的权限,也不允许使用HTTPURLCONNECTION。

【问题讨论】:

  • ' 或导致异常' - 那么它是否会导致异常?如果是这样,请发布堆栈跟踪(并请显示您的 catch 块...
  • java.net.SocketException:软件导致连接中止:套接字写入错误
  • 你应该使用Scanner和PrintWriter,这样更容易处理。 (甚至是 HttpURLConnection 类)
  • 不,我必须在没有 HTTP URL 连接类的情况下这样做......
  • 您的服务器可以通过网络浏览器访问吗?

标签: java sockets networking communication bufferedwriter


【解决方案1】:

java.net.SocketException:软件导致连接中止:套接字写入错误

这通常是由于写入已被另一端关闭的连接造成的。由于您没有发送内容长度标头,因此服务器在第一次请求后关闭了连接。

HTTP 中的行终止符是 \r\n,而不是 \n。

您需要仔细查看 HTTP 1.1 协议 RFC。或者使用 HttpURLConnection,它将完全为您处理。除非这是家庭作业,并且您需要自己实现 HTTP 1.1,这看起来很奇怪,否则拒绝使用 JDK 中实际上专门针对这个问题设计的一个类也是很奇怪的。

【讨论】:

    【解决方案2】:

    尝试在每个 println 之后添加 out.flush()。

    【讨论】:

    • (1) 添加刷新不能解决“套接字写入错误”。 (2) 如果那是问题,那它根本就行不通。 (3) 他在自动刷新模式下使用 PrintWriter,所以额外的 flush() 不会做任何有用的事情。 -1
    猜你喜欢
    • 2017-01-18
    • 2014-11-06
    • 2011-04-27
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多