开发者社区> 问答> 正文

关于Socket的一个奇怪的问题 跪求帮忙解释下   400 请求报错 

 

  • 第1段
  • 第2段

    ///         /// 效率最高的接收数据方法         // /         void OptimalListen()         {             while (true)             {                 //接受请求连接,如果没有连接请求,此进程会被挂起直到有连接请求(如果使用Poll方法去判断是否有挂起连接请求,CPU至少50%)                 Socket accept = socketListener.Accept();                 //不判断刚刚接收请求的连接的发过来的字节数,否则会丢失数据                 //if (accept.Available > 0)                 //{                    &nb 点击进入第2段

sp;         //观察发现,有时候明明收到数据,可是accept.Available却为0,这是为什么?谁能解释清楚?                 this.label1.Text = accept.Available.ToString();                 NetworkStream netStream = new NetworkStream(accept);                 StreamReader reader = new StreamReader(netStream);                 string text = reader.ReadToEnd();                 //richTextBox1.AppendText(text + "\n");                 this.Invoke(new GetText(delegate(string str) { this.richTextBox1.AppendText(str + "\n"); }), text);                 reader.Close();                 accept.Close();         点击进入第1段     请大家给我解释下好么? 我看到这个问题 没解决了!

展开
收起
kun坤 2020-05-29 17:51:35 448 0
1 条回答
写回答
取消 提交回答
  • 用java语言试验了下 也是同样问题!!######服务器端代码如下: public static void main(String args[]) {     try {       try {         //创建一个ServerSocket在端口5366监听客户请求         server = new ServerSocket(5366);       } catch (Exception e) {       }       boolean b = true;       while(b){       try {         //使用accept()阻塞等待客户请求,有客户请求到来则产生一个Socket对象,并继续执行         socket = server.accept();       } catch (Exception e) {           e.printStackTrace();       }       //由Socket对象得到输入流,并构造相应的BufferedReader对象       InputStream input = socket.getInputStream();       System.out.println(input.available());       BufferedReader reader = new BufferedReader(new InputStreamReader(input));

          //由Socket对象得到输出流,并构造PrintWriter对象       PrintWriter writer = new PrintWriter(socket.getOutputStream());

          //打印从客户端读入的字符串       System.out.println("Client:" + reader.readLine());

          //把反馈信息写入客户端       writer.print("msg to client");       writer.flush();

          //释放资源       writer.close(); //关闭Socket输出流       reader.close(); //关闭Socket输入流       socket.close(); //关闭Socket       }       server.close(); //关闭ServerSocket     } catch (Exception e) {         e.printStackTrace();     }  
    } 客户端代码如下: public static void main(String[] args) {     try {       //向本机的5366端口发出客户请求       Socket socket = new Socket("127.0.0.1", 5366);

          //由Socket对象得到输出流,并构造PrintWriter对象       PrintWriter writer = new PrintWriter(socket.getOutputStream());

          //由Socket对象得到输入流,并构造相应的BufferedReader对象       BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

          //向服务端传递消息       String readline = "你好么";       writer.println(readline);       writer.flush();

          //接受服务端的消息反馈       System.out.println("Server:" + reader.readLine());

          //释放资源       writer.close(); //关闭Socket输出流       reader.close(); //关闭Socket输入流       socket.close(); //关闭Socket     } catch (Exception e) {       e.printStackTrace();     } }######经过java代码测试  服务器端输出 有结果 但是System.out.println(input.available());输出的仍然是0 这是为什么啊?######有人愿意帮忙么?谢谢了 我就是看到这个问题 自己没解决了 很是心烦啊!###### 你上面的代码我看了,原因是你的Socket中通讯完之后被重置掉了,无论你用java还是.NET都是这样的,当重置的时候会将读取到的标记信息设置为0!这没什么感到好奇的!因为连接已经被重置了也就是ConnectionReset!######谢谢你晶晶宝贝,可惜我没听懂。######请高手帮忙解决。######D######这个首先要明白网络流不同于文件流,当你调用input.available()的时候,数据还可能在“路上”,所以你会得到0,当你readLine时,这个是会阻塞到收到数据为止的,所以你可以成功读到数据。######你应该先看看JDK上面对于这个方法的使用说明 最好是自己去看源码吧 呵呵   如果实在想输出的话 可以这样写 System.out.println("come on baby : "); System.out.println("Number is " + input.available());

    2020-05-29 17:51:46
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
当泛型遇上协议 立即下载
Android插件化-从入门到"放弃" 立即下载
低代码开发师(初级)实战教程 立即下载