古狗 2017-06-30 06:42 采纳率: 0%
浏览 3035

【新手】socket服务器获取浏览器请求时inputstream.read()返回值出问题

通过socket练习手写服务器,希望在服务器接收浏览器提交请求时通过循环执行inputstream.read()获取数据放入byte[1024]中,转成字符串最后输出至控制台,但在测试时虽然浏览器提交的测试数据不到1024字节,在第一次循环时inputsrteam.read()的返回值既不是-1也不是1024,而是接受到的数据实际大小(大约400多字节),导致第二次进入while循环,程序就阻塞在第二次inputstream.read()中,此时浏览器再次提交表单时服务器这边就直接报错了,报错点仍然指向while循环判断中的inputstream.read(),这明显不合理啊,向各位大佬求解。。。

源码:

package test;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {
    ServerSocket server;

    public static void main(String[] args) {
        Server server = new Server();
        server.start();

    }

    public void start() {
        try {
            server = new ServerSocket(8888);
            receive();
        } catch (IOException e) {
            System.out.println("开启数据库失败");
            e.printStackTrace();
        }

    }

    private void receive() {
        try {
            Socket client = server.accept();

            byte[] buff = new byte[1024];
            StringBuilder sb = new StringBuilder();
            BufferedInputStream bis = new BufferedInputStream(client.getInputStream());
            while (-1 != bis.read(buff)) {
                sb.append(new String(buff, 0, buff.length));
            }
            String requestInfo = sb.toString().trim();

            System.out.println(requestInfo);

        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("开启客户端socket失败");
        }
    }

    public void stop() {

    }

}

浏览器第二次提交表单时,服务器这边的报错信息,(浏览器第一次提交表单时程序处于阻塞状态):

 java.net.SocketException: Connection reset
开启客户端socket失败
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at test.Server.receive(Server.java:48)
    at test.Server.start(Server.java:24)
    at test.Server.main(Server.java:17)
  • 写回答

1条回答 默认 最新

  • footrip 2017-08-22 03:29
    关注

    bis.read(buff) 返回的不是-1,read会阻塞

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料