java socket实现B/S后台,input流读数据的时候被阻塞

Left_you 2013-11-08 11:32:10
记得之前写过,没遇到阻塞的问题,这随便写了一下居然就遇到了。
貌似是InputStream读不到正文,只能读到http的头。
那么我要怎么读取全部前台传来的数据呢?
好奇怪我之前怎么没遇到这个问题。
...全文
406 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Left_you 2013-11-18
  • 打赏
  • 举报
回复
引用 2 楼 xiaomm627 的回复:
阻塞的话你可以分析下: isr.read()没有读取到一个字节的数据,而客户端的连接仍然存在,那么服务端就会一直等待,直到读取到数据(即阻塞)。 为什么没有读到这一个字节的数据,你要找找原因了。服务端看不出什么端倪,把客户端发送数据的代码贴出来看看。
刚刚看错了你的意思了, 我这个客户端就是浏览器。
Left_you 2013-11-18
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
你是浏览器直接访问localhost:88吗? 从HTTP1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 但是你server端一直等待着read。所以一直等待浏览器的输入。浏览器上也一直等待,所以就是你看到的卡了。你可以把浏览器的等待关了。 在最后加个打印,可以看出来
osw = new OutputStreamWriter(s.getOutputStream());
            osw.write("<html><head><title>test</title></head><body>测试</body></html>");
System.out.println("done");
浏览器关闭会报错,不过我把循环条件改了,while (isr.available() > 0) 这样就能打印出来了。
Left_you 2013-11-18
  • 打赏
  • 举报
回复
引用 4 楼 develop_design_level 的回复:
检查一下你的服务器端的代码吧。看看服务器端的socket的输出流是否进行了下面的操作: out.flush(); 如果没有flush,就会造成阻塞
服务端的代码就那么几行,我1楼贴出来了。
  • 打赏
  • 举报
回复
检查一下你的服务器端的代码吧。看看服务器端的socket的输出流是否进行了下面的操作: out.flush(); 如果没有flush,就会造成阻塞
teemai 2013-11-13
  • 打赏
  • 举报
回复
你是浏览器直接访问localhost:88吗? 从HTTP1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。 但是你server端一直等待着read。所以一直等待浏览器的输入。浏览器上也一直等待,所以就是你看到的卡了。你可以把浏览器的等待关了。 在最后加个打印,可以看出来
osw = new OutputStreamWriter(s.getOutputStream());
            osw.write("<html><head><title>test</title></head><body>测试</body></html>");
System.out.println("done");
xiaomm627 2013-11-13
  • 打赏
  • 举报
回复
阻塞的话你可以分析下: isr.read()没有读取到一个字节的数据,而客户端的连接仍然存在,那么服务端就会一直等待,直到读取到数据(即阻塞)。 为什么没有读到这一个字节的数据,你要找找原因了。服务端看不出什么端倪,把客户端发送数据的代码贴出来看看。
Left_you 2013-11-08
  • 打赏
  • 举报
回复
主要代码:
    public static void main(String[] args)
    {
        System.out.println("start");
        Socket s = null;
        OutputStreamWriter osw = null;
        InputStream isr = null;
        try
        {
            ServerSocket ss = new ServerSocket(88);
            s = ss.accept();
            isr = s.getInputStream();
            
//            读取数据导致线程阻塞
//            int c = isr.read();
//            while (c != -1)
//            {
//                System.out.print((char)c);
//                c = isr.read();
//            }
            
            osw = new OutputStreamWriter(s.getOutputStream());
            osw.write("<html><head><title>test</title></head><body>测试</body></html>");
        }

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧