`
charseller
  • 浏览: 4796 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

java Socket InputStream 阻塞 问题

阅读更多
第一次写,不好意思,有不对地方多多指出


在Java Socket 编程中,对 InputStream的read()=-1标明流结束,一般按照

public byte[] getReqData(InputStream is){
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try{
			int iR = is.read();
			while(iR != -1){
				baos.write(iR);
				iR = is.read();
			}
		}catch(Exception e){
			return null;
		}
		return baos.toByteArray();
	}

获取byte

但是出现了一直等待现象,而在客户端是本地发送测试的。。。跟踪是在iR = is.read()时在读完最后一个字节就阻塞了,继续等-1的到来啊。。。。

网上也有很多对此的提问。

搜索了下,发现这个帖子讨论的比较多:

http://ansonlai.iteye.com/blog/556287

楼主帖子和回复也很有帮助。不过俺还是不满意,继续搜索,测试,得以发现原因,在那个帖子回复如下:

在我的程序中同样出现了这个问题,搜索到此。3楼的方案虽然解决了问题,仍然没有说明问题所在。用中文搜索没找到满意解决,只得英文搜索,搜索到:http://stackoverflow.com/questions/611760/java-inputstream-read-blocking

其中有段话有启发:It returns -1 if it's end of stream. If stream is still open (i.e. socket connection) but no data has reached the reading side (server is slow, networks is slow,...) the read() blocks.

最后发现其实有关 read()本身没问题,而是client端没有做好。

在socket.getOutputStream().write(data)后,尝试socket.getOutputStream().close()。服务器端没问题了,read()会返回-1咯。。。呵呵,但是(最怕但是),客户端close OutputStream后等带服务器的回应的InputSteam.read()出现了:socket closed Exception

最后发现Socket有 shutdownOutput()方法!哈哈,在客户端write,flush后再调用shutdownOutput(),成了!后面的inputStream仍然可以。。。

当然,如果客户端和服务器程序是各自开发,楼主及3楼的方法还是必要。

这次我碰到的问题其实说明这个现在还是普便存在的:本来用http实现通信的,用httpserver的httpExchange.getRequestBody()得到的InputStream处理就没有出现这个问题。后来到现场才发现服务器的开发单位最终是用socket实现的通信,还专门提出了socket的头6个字节表示长度,俺这么一写,才发现对方可能也是碰到这个问题,采取了长度方法来处理。(我是在做服务器端simulator,同时也要做这个simulator的测试,所以客户端simulator也做,没听糊涂吧:) )

shutdownOutput
public void shutdownOutput()
                    throws IOException
Disables the output stream for this socket. For a TCP socket, any previously written data will be sent followed by TCP's normal connection termination sequence. If you write to a socket output stream after invoking shutdownOutput() on the socket, the stream will throw an IOException.

也按照1楼同学的提示,对一个socket的先发一段,睡10秒,100秒再发后面一段,服务器都可以正常接收,客户端也正常收到返回数据
分享到:
评论

相关推荐

    Socket中InputStream的read方法的阻塞特性

    Socket中的InputStream的`read`方法是Java网络编程中一个核心的概念,它在处理客户端与服务器之间的数据传输时起着至关重要的作用。`read`方法的阻塞特性是其设计的一个重要特点,也是理解多线程和并发编程的关键点...

    java socket 视频流转发socket

    Java Socket是Java编程语言中用于网络通信的核心API,它提供了低级别的、面向连接的、基于TCP/IP协议的网络通信能力。在"Java Socket 视频流转发Socket"这个主题中,我们将深入探讨如何使用Java Socket来处理视频流...

    JAVA Socket 经典教程

    - **NIO(非阻塞I/O)**:Java NIO库提供了非阻塞的Socket编程模型,适用于高并发场景,如`Selector`和`Channel`。 7. **实践应用** - **聊天应用**:基于Socket的简单聊天室,客户端发送消息到服务器,服务器...

    Java Socket 聊天通信演示代码

    Java Socket 是一种网络通信协议,它是Java编程语言中实现客户端-服务器模型的基础。Socket 提供了低级别的、面向连接的、双向通信的网络接口,允许应用程序通过网络进行数据传输。在本示例中,我们将深入探讨Java ...

    java socket长连接中解决read阻塞的3个办法

    总结来说,Java Socket长连接中解决`read()`阻塞问题可以通过约定数据长度、设置超时时间或关闭连接等方式实现。具体选择哪种方法,需要根据实际应用的需求和限制来权衡。在某些情况下,可能需要结合多种策略,以...

    Java Socket网络编程.pdf

    Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...

    java socket工具类示例

    Java Socket工具类是Java网络编程中的重要组成部分,它提供了客户端和服务器端进行双向通信的基础。在本示例中,我们将探讨如何使用Java Socket创建一个简单的控制台聊天系统,包括客户端(client)和服务器端...

    java socket 中文教程

    Java Socket还支持其他高级功能,如SOCKET选项(如SO_REUSEADDR、SO_TIMEOUT)、SSL/TLS加密(javax.net.ssl包)以及NIO(非阻塞I/O)等,这些特性使得Java Socket在高性能、高安全性的网络应用中具有广泛的应用。...

    java socket 经典教程

    `InputStream`和`OutputStream`的子类`SocketInputStream`和`SocketOutputStream`分别对应于这两个流。 - 例如,可以使用`DataInputStream`和`DataOutputStream`进行类型安全的数据读写,它们提供了如`readInt()`和...

    JAVA Socket 网络编程教程

    1. InputStream和OutputStream:Socket提供了InputStream和OutputStream的子类,如SocketInputStream和SocketOutputStream,用于读写网络数据。 2. BufferedReader和PrintWriter:通常使用BufferedReader读取Socket...

    Java Socket PC端传输文件简易服务器客户端

    4. **套接字输入/输出流(SocketInputStream/SocketOutputStream)**: - Socket类提供了与之相关的输入流和输出流,用于在网络中进行数据的读写操作。客户端通过Socket的输出流将文件内容写入网络,服务器端则通过...

    java socket 学习资料

    - Java Socket编程中需要处理`IOException`,这包括连接失败、网络中断、超时等问题。 - 使用`try-catch`语句来捕获并处理这些异常,保证程序的健壮性。 8. **性能优化**: - 对于高并发场景,可以考虑使用多...

    Java socket聊天程序 有界面

    Java Socket聊天程序是一种基于网络通信的多用户交互应用,它利用Java的Socket API来实现客户端与服务器之间的实时通信。在本程序中,我们主要探讨以下几个关键知识点: 1. **Java Socket API**: Java Socket是Java...

    java socket传输demo

    Java Socket编程是网络编程中的重要一环,它提供了在不同计算机之间进行低级通信的机制。在这个"java socket传输demo"中,我们将深入探讨Java如何使用Socket类来实现客户端和服务器端之间的数据交换。 首先,Socket...

    一个简单的java socket程序

    Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信的途径。在这个"一个简单的java socket程序"中,我们将会探讨如何构建一个基础的服务器端(Server)和客户端(Client)模型,这对于初学者来说...

    java socket 编程文档

    2. NIO(Non-blocking I/O):Java NIO提供了一种非阻塞I/O模型,适用于高并发场景,提高性能。 3. 组播Socket:Java的MulticastSocket类支持多播通信,允许多个接收者同时接收相同的数据包。 七、实战应用 Java ...

    java socket通信实现

    Java Socket通信实现是一种基于TCP/IP协议的网络通信方式,它允许两台计算机通过互联网进行双向数据传输。在Java中,Socket类和ServerSocket类是实现客户端-服务器模型通信的核心工具。下面将详细介绍Java Socket...

    java socket教程java socket教程

    在Java Socket编程中,数据通常是通过InputStream和OutputStream进行传输的。例如,Socket的getInputStream()和getOutputStream()方法分别返回InputStream和OutputStream实例,可用于读写操作。 1. 输入流:用于从...

    java socket通信自定义消息协议

    Java Socket通信是网络编程中的基础部分,用于实现两个应用程序之间的双向通信。自定义消息协议是在标准TCP/IP协议之上,根据具体需求设计的一种数据传输格式。本篇将详细讲解如何在Java中实现基于Socket的自定义...

    Java Socket学习---多线程阻塞

    本教程主要探讨的是如何在Java中使用Socket实现多线程阻塞式通信,这通常涉及到服务器端(EchoServer)和客户端(EchoClient)的设计。在本文中,我们将详细解析`EchoServer.java`、`SocketUtils.java`和`EchoClient...

Global site tag (gtag.js) - Google Analytics