/// /// 效率最高的接收数据方法 // / 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段 请大家给我解释下好么? 我看到这个问题 没解决了!
用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());
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。