在用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读取数据问题”时,通常涉及到如何正确、有效地使用`InputStream`及其子类来处理数据输入。 在给定的博客链接(由于实际链接无法访问,以下内容基于常见问题进行假设)中,可能讨论了...
例如,当我们创建一个Socket连接到服务器后,我们可以获取到一个`InputStream`实例,然后通过调用`read`方法来接收服务器发送的数据。当`read`方法被调用时,如果缓冲区中没有数据,那么这个方法会阻塞,直到有数据...
一旦连接建立,就可以通过Socket对象的getInputStream()方法获取SocketInputStream实例,然后使用read()或read(byte[])等方法从远程主机读取数据。 在Unix和Linux环境中,网络编程还需要关注线程安全和资源管理。...
- **InputStream**:Server端通过Socket对象的`getInputStream()`方法获取输入流,用于读取客户端发送的数据。 - **BufferedReader**:通常我们会用`BufferedReader`配合`InputStreamReader`来读取输入流中的字符...
数据的读取通常通过Socket的`InputStream`实现。在Android中,我们常用`BufferedReader`来读取服务器返回的数据: ```java InputStream is = socket.getInputStream(); BufferedReader reader = new ...
- 获取输入流:同样,通过`Socket`的`getInputStream()`方法获取一个`InputStream`,然后利用`DataInputStream`或`BufferedReader`等类读取服务器返回的数据。 ```java InputStream inputStream = socket....
- 接收服务器返回的处理结果,使用`Socket`的`InputStream`读取。 - 当发送完三次数据并接收完处理结果后,关闭`Socket`连接。 在压缩包中的`SocketTest`文件可能包含了这样的实现,包括服务器端和服务端的类,...
当接收到客户端的数据时,服务器端同样会通过Socket的`InputStream`读取并处理数据。 以上就是"socket定时发送数据小程序"的核心知识点。这个程序展示了如何结合Socket和定时器来实现定期的数据传输,这对于实时...
客户端则相反,它接收来自服务器的数据,通过Socket的InputStream读取,并用FileOutputStream将数据写入本地文件,从而实现文件的传输。 以下是实现这一过程的主要步骤: 1. **服务器端**: - 创建ServerSocket并...
服务器端通常会使用ServerSocket监听特定端口,接收到客户端请求后创建Socket连接,并通过Socket的InputStream读取客户端发送的数据,然后通过OutputStream回传响应。服务器端的实现不在本文讨论范围内,但它是整个...
首先,我们需要创建一个Socket实例,然后通过输入流(InputStream)和输出流(OutputStream)来读写数据。 下面是一个简单的Android客户端示例,展示如何通过Socket发送Json数据: ```java import java.io....
- 读取数据:通过新Socket的InputStream读取客户端发送的数据。 - 发送数据:使用Socket的OutputStream向客户端回传数据。 - 关闭连接:完成交互后,关闭Socket和ServerSocket。 5. 浏览器访问: 在描述中提到...
在IT领域,Socket编程是网络通信的基础,而XML(Extensible Markup Language)则是...在xfunds-socket-price这个项目中,可能涉及到通过Socket连接获取价格数据,这些数据以XML格式传输,然后在客户端进行解析和处理。
5. **关闭连接**:完成数据传输后,记得关闭所有打开的Socket和InputStream/OutputStream,以释放系统资源: ```java in.close(); out.close(); clientSocket.close(); forwardSocket.close(); serverSocket....
每发送一个数据块,服务器端就需要使用对应的`InputStream`(`Socket.getInputStream()`)来接收并存储。为了保证数据的完整性,可以使用`DataInputStream`和`DataOutputStream`进行类型安全的数据交换,并确保每个...
// 从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连接,我们需要在Android代码中创建一个Socket实例,指定服务器的IP地址和端口号,然后通过Socket的输入流(InputStream)读取从服务器传来的数据。 数据传输格式一般为二进制或文本。考虑到MPU6050...
在服务器端,我们使用`Socket.getInputStream()`获取输入流,然后读取客户端发送的数据;用`Socket.getOutputStream()`获取输出流,向客户端发送数据。在客户端,操作方式类似: 服务器端发送数据: ```java ...
- 音频数据通常是二进制格式,如PCM或MP3,需要通过InputStream读取并存储到本地文件或内存缓冲区。 2. **客户端实现**: - 创建Socket实例,指定服务器的IP地址和端口号,建立连接。 - 获取Socket的...
4. 从InputStream读取客户端发送的数据。 5. 通过OutputStream向客户端返回数据。 6. 使用完毕后,关闭Socket及其相关的流。 示例代码如下: ```java try { ServerSocket serverSocket = new ServerSocket(服务器...