nicovv 2009-11-16 17:44
浏览 317
已采纳

socket 不能向服务端write 第二次

socket并无关闭,为何第二次write() 之后 无读到数据的?

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

public class MianTest {
public static void main(String args0[]) throws Exception {
Socket socket = new Socket("localhost", 80);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

    String header1 = "GET /hello.txt HTTP/1.1\r\nHost: localhost\n\r\n";
    String header2 = "GET /hi.txt HTTP/1.1\r\nHost: localhost\r\n\r\n";

    out.write(header1);

    out.flush();
    int i = 0;
    while ((i = in.read()) != -1) {
        System.out.print((char) i);
    }

            out.write(header2);
    out.flush();
    int c = 0;
    while ((c = in.read()) != -1) {
        System.out.print((char) c);

    }
         socket.close();
}

}
[b]问题补充:[/b]
to liuyu220

我是用socket 向tomcat通讯

服务端完成一次请求完后就关闭了inputstream,output数据回来 这很正常,
而第2次write(),其实有无去到服务端呢?还是服务端认为inputstream关闭了
之后来的数据不需要再读?

有无方法,不 new一个socket ,而发出第2次通讯

  • 写回答

4条回答 默认 最新

  • xxxxxxxxxxxxxxxxx 2009-11-27 16:11
    关注

    [code="java"]int i = 0;
    while ((i = in.read()) != -1) {
    System.out.print((char) i);
    }[/code]

    尽管http 1.1 支持长连接, 但还是由上面的代码引起的,它被阻碍了。
    只有等待server side阻塞(如timeout),才会跳出循环。

    稍微简单修改一下。

    [code="java"]Socket socket = new Socket("localhost", 80);
    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

        String header1 = "HEAD /  HTTP/1.1\r\nHost: $host\r\n\r\n";
        String header2 = "HEAD /  HTTP/1.1\r\nHost: $host\r\n\r\n";
    
        out.write(header1);
    
    
        out.flush();
    
        StringBuffer sb = new StringBuffer();
            while (true) {
                    char c = (char) in.read();
                    System.out.print(c);
                    if(c=='\r' || c=='\n') {
                        sb.append(c);
                    }
                    else {
                        sb.delete(0, sb.length());
                    }
                    if(sb.toString().equals("\r\n\r\n")) {
                        break;
                    }
            }
    
    
    
            out.write(header2);
    
    
            out.flush();
            sb.delete(0, sb.length());
                while (true) {
                        char c = (char) in.read();
                        System.out.print(c);
                        if(c=='\r' || c=='\n') {
                            sb.append(c);
                        }
                        else {
                            sb.delete(0, sb.length());
                        }
                        if(sb.toString().equals("\r\n\r\n")) {
                            break;
                        }
                }
    
            socket.close();
    

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值