`
san_yun
  • 浏览: 2652082 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

socket InputStream读取数据的问题记录

 
阅读更多

在用java写socket client的发现一个问题,如果直接运行程序会报无法序列化的错误,但如果debug则不会报错,应该大半天的研究才发现问题在于java中从socket读取inputStream时,未必能一次性全部读取到,这可能应为网络延迟,也可能应为缓冲区还没有准备好,之前代码是这样:

 

public String readLine(int length) throws IOException {
		String buf = "";
		int index = 0;
		InputStream input = socket.getInputStream();
		
		while (true) {
			index = buf.indexOf("\r\n");
			if (index >= 0) {
				break;
			}
			
			byte[] data = new byte[length];
			input.read(data,length);
			String line = new String(data, Protocol.ENCODE);
			System.out.println("read line: " + off);
			buf += line;
			off += off;

		}
		return buf.substring(0, index);
	}

 应该修改为:

	public String readLine(int length) throws IOException {
		String buf = "";
		InputStream input = socket.getInputStream();
		int index = 0;
		while (true) {
			index = buf.indexOf("\r\n");
			if (index >= 0) {
				break;
			}
			int length0 = Math.min(input.available(), length);
			if (length0 == 0) {
				continue; //try again
			}
			byte[] data = new byte[length0];
			input.read(data);
			String line = new String(data, Protocol.ENCODE);
//			System.out.println(length0+","+line);
			buf += line;
		}
		return buf.substring(0, index);
	}

 

 

 

分享到:
评论

相关推荐

    java InputStream读取数据问题

    当我们遇到“Java InputStream读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...

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

    例如,当我们创建一个Socket连接到服务器后,我们可以获取到一个`InputStream`实例,然后通过调用`read`方法来接收服务器发送的数据。当`read`方法被调用时,如果缓冲区中没有数据,那么这个方法会阻塞,直到有数据...

    SocketInputStream.rar_网络编程_Unix_Linux_

    一旦连接建立,就可以通过Socket对象的getInputStream()方法获取SocketInputStream实例,然后使用read()或read(byte[])等方法从远程主机读取数据。 在Unix和Linux环境中,网络编程还需要关注线程安全和资源管理。...

    Android开发,Socket Client端和Socket Server端数据发送和接收

    - **InputStream**:Server端通过Socket对象的`getInputStream()`方法获取输入流,用于读取客户端发送的数据。 - **BufferedReader**:通常我们会用`BufferedReader`配合`InputStreamReader`来读取输入流中的字符...

    Android Socket编程实现服务器数据读取

    数据的读取通常通过Socket的`InputStream`实现。在Android中,我们常用`BufferedReader`来读取服务器返回的数据: ```java InputStream is = socket.getInputStream(); BufferedReader reader = new ...

    java使用Socket类接收和发送数据

    - 获取输入流:同样,通过`Socket`的`getInputStream()`方法获取一个`InputStream`,然后利用`DataInputStream`或`BufferedReader`等类读取服务器返回的数据。 ```java InputStream inputStream = socket....

    利用socket连续发送与连续接收数据

    - 接收服务器返回的处理结果,使用`Socket`的`InputStream`读取。 - 当发送完三次数据并接收完处理结果后,关闭`Socket`连接。 在压缩包中的`SocketTest`文件可能包含了这样的实现,包括服务器端和服务端的类,...

    socket定时发送数据小程序

    当接收到客户端的数据时,服务器端同样会通过Socket的`InputStream`读取并处理数据。 以上就是"socket定时发送数据小程序"的核心知识点。这个程序展示了如何结合Socket和定时器来实现定期的数据传输,这对于实时...

    基于socket的文件传输

    客户端则相反,它接收来自服务器的数据,通过Socket的InputStream读取,并用FileOutputStream将数据写入本地文件,从而实现文件的传输。 以下是实现这一过程的主要步骤: 1. **服务器端**: - 创建ServerSocket并...

    Socket发送并接收服务器返回的数据

    服务器端通常会使用ServerSocket监听特定端口,接收到客户端请求后创建Socket连接,并通过Socket的InputStream读取客户端发送的数据,然后通过OutputStream回传响应。服务器端的实现不在本文讨论范围内,但它是整个...

    android 利用socket 发送Json数据demo

    首先,我们需要创建一个Socket实例,然后通过输入流(InputStream)和输出流(OutputStream)来读写数据。 下面是一个简单的Android客户端示例,展示如何通过Socket发送Json数据: ```java import java.io....

    Socket客户端向服务端发送数据

    - 读取数据:通过新Socket的InputStream读取客户端发送的数据。 - 发送数据:使用Socket的OutputStream向客户端回传数据。 - 关闭连接:完成交互后,关闭Socket和ServerSocket。 5. 浏览器访问: 在描述中提到...

    socket客户端长连接实现以及xml文件解析

    在IT领域,Socket编程是网络通信的基础,而XML(Extensible Markup Language)则是...在xfunds-socket-price这个项目中,可能涉及到通过Socket连接获取价格数据,这些数据以XML格式传输,然后在客户端进行解析和处理。

    java socket 视频流转发socket

    5. **关闭连接**:完成数据传输后,记得关闭所有打开的Socket和InputStream/OutputStream,以释放系统资源: ```java in.close(); out.close(); clientSocket.close(); forwardSocket.close(); serverSocket....

    使用Socket传输视频

    每发送一个数据块,服务器端就需要使用对应的`InputStream`(`Socket.getInputStream()`)来接收并存储。为了保证数据的完整性,可以使用`DataInputStream`和`DataOutputStream`进行类型安全的数据交换,并确保每个...

    将输出流OutputStream转化为输入流InputStream的方法

    // 从InputStream读取数据 byte[] buffer = new byte[1024]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { System.out.print(new String(buffer, 0, bytesRead)); } } catch (IOException ...

    安卓socket接收wifi发送来的mpu6050数据并显示

    为了建立Socket连接,我们需要在Android代码中创建一个Socket实例,指定服务器的IP地址和端口号,然后通过Socket的输入流(InputStream)读取从服务器传来的数据。 数据传输格式一般为二进制或文本。考虑到MPU6050...

    用来模拟接收Socket Server 接收数据,发送数据 DEMO

    在服务器端,我们使用`Socket.getInputStream()`获取输入流,然后读取客户端发送的数据;用`Socket.getOutputStream()`获取输出流,向客户端发送数据。在客户端,操作方式类似: 服务器端发送数据: ```java ...

    使用Socket传输音频

    - 音频数据通常是二进制格式,如PCM或MP3,需要通过InputStream读取并存储到本地文件或内存缓冲区。 2. **客户端实现**: - 创建Socket实例,指定服务器的IP地址和端口号,建立连接。 - 获取Socket的...

    android socket通信实例程序

    4. 从InputStream读取客户端发送的数据。 5. 通过OutputStream向客户端返回数据。 6. 使用完毕后,关闭Socket及其相关的流。 示例代码如下: ```java try { ServerSocket serverSocket = new ServerSocket(服务器...

Global site tag (gtag.js) - Google Analytics