byte
[
]
bytes
=
new
byte
[
1024
]
;
int
length
=
0
;
while
(
(
length
=
dis
.
read
(
bytes
,
0
,
bytes
.
length
)
)
!=
-
1
)
{
System
.
out
.
println
(
bytes
.
length
)
;
fos
.
write
(
bytes
,
0
,
length
)
;
fos
.
flush
(
)
;
System
.
out
.
println
(
"======== 文件接收成功 [File Name:"
+
fileName
+
"] [Size:"
+
getFormatFileSize
(
fileLength
)
+
"] ========"
)
;
我给他调试的时候发现确确实实发送第一次文件后就就一直阻塞在while循环里了,出不来。本来传输完第一次的文件后应该有打印“======== 文件接收成功 [File。。。。。。”这些信息,但是实际上没有,而且也不报错。调试的时候打断点也是走着走着断点就不见了,要说他是阻塞也不像是阻塞,因为如果是阻塞的话起码断点是会存在的只是无法往下运行了而已,但是他这个调试就是直接断点就消失了,我也懵逼了。后来查资料才发现原来只要客户端的DataOutputStream不close掉,那么服务端的DataInputStream read就永远不等于-1。即使文件的数据已经传完了,DataInputStream依旧会等着客户端DataOutputStream再传数据过来。
最后只能通过判断文件的的大小来确认文件是否已经传输完成
。
解决代码代码如下
String fileName = dis.readUTF();
long fileLength = dis.readLong();
File directory = new File(savepath);
if(!directory.exists()) {
directory.mkdir();
File file = new File(directory.getAbsolutePath() + File.separatorChar + fileName);
fos = new FileOutputStream(file);
byte[] bytes = new byte[1024];
int length = 0;
while((length = dis.read(bytes, 0, bytes.length)) != -1) {
System.out.println(bytes.length);
fos.write(bytes, 0, length);
fos.flush();
if(fileLength == file.length()) break;
System.out.println("======== 文件接收成功 [File Name:" + fileName + "] [Size:" + getFormatFileSize(fileLength) + "] ========");
最近被一个朋友问答一个关于sokcet文件传输的问题,他发现他写的代码只能发送一次文件,没办法发送第二次,或者说发送第二次的时候服务端就接收不到了。部分代码如下 // 开始接收文件 byte[] bytes = new byte[1024]; //byte[] bytes = new byte[dis.available()]; int length = 0;
在使用DataInputStream时候,经常会使用到readUTF来读取一段字符串,但是readUTF是如何知道该字符串有多长的呢?
下面的例子是对DataInputStream的简单使用:
package s1;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io...
问题1:如何解决socket中如何处理DatainputStream的read方法读取堵塞?如果没有长时间数据进来如何让线程运行结束呢?大家看下代码哦,然后说下如何处理呢?
代码如下:
Socket 的 setSoTimeout() 方法必须在接收数据之前执行才有效. 此外, 当输入流的 read()方法抛出 SocketTimeoutException 后, Socket 仍然是连接的, 可
DataInputStream 是用来装饰其它输入流,它允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
要想使用数据输入流,则肯定要用户指定数据的保存格式。必须按指定的格式保存数据,才可以将数据输入流将数据读取进来。
一、继承关系与初始化方式
二、方法列举
读取方法一:
int read(byte b[]):从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 ...
DataInputStream类readBoolean()方法 (DataInputStream Class readBoolean() method)
readBoolean() method is available in java.io package.
readBoolean()方法在java.io包中可用。
readBoolean() method is used to check...
Java网络编程时出现java.io.DataInputStream.readInt(Unknown Source),且输出的数据乱码。
为了可以传送int型的数据,用的DataOutputStream类来传送,接收端用的是num = dis.readInt()一直乱码,原因是发送端未使用dos.writeInt(num)。
正确代码如下:
package network;
import java.io.DataInputStream;
import java.io.IOException;
// 数据输入流: DataInputStream
// DataInputstream (InputStream in)
// 数据输出流: Da taOutputStream
// DataOutputStream (OutputStream out )
package cn.study_01;
import java.io.*;
public class DateStreamDemo {
publi
// 创建ServerSocket对象,并监听端口
ServerSocket server = new ServerSocket(8888);
System.out.println("等待接收文件...");
// 阻塞,等待客户端发送文件
Socket socket = server.accept();
System.out.println("文件传输开始...");
// 创建输入流,从Socket中读取数据
DataInputStream dis = new DataInputStream(socket.getInputStream());
// 读取文件名和文件长度
String fileName = dis.readUTF();
long fileLength = dis.readLong();
System.out.println("文件名:" + fileName);
System.out.println("文件长度:" + fileLength);
// 创建输出流,将接收到的文件写入磁盘
FileOutputStream fos = new FileOutputStream(new File(fileName));
// 创建缓冲区并读取文件内容,写入到磁盘中
byte[] buffer = new byte[1024];
int length = 0;
while ((length = dis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
// 关闭流和Socket
fos.close();
dis.close();
socket.close();
server.close();
System.out.println("文件传输完成!");
} catch (IOException e) {
e.printStackTrace();
该代码创建了一个ServerSocket,并监听端口8888。当客户端连接上来时,使用DataInputStream从Socket中读取文件名和文件长度,并将接收到的文件写入磁盘中。
2. 发送端代码
```java
import java.io.*;
import java.net.Socket;
public class Sender {
public static void main(String[] args) {
try {
// 创建Socket对象并连接到目标主机
Socket socket = new Socket("192.168.0.10", 8888);
// 创建输出流,将文件发送到Socket中
File file = new File("D:/test.txt");
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
// 将文件名和长度写入Socket中
dos.writeUTF(file.getName());
dos.writeLong(file.length());
System.out.println("文件名:" + file.getName());
System.out.println("文件长度:" + file.length());
// 创建输入流并读取文件内容,发送到Socket中
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[1024];
int length = 0;
while ((length = fis.read(buffer)) > 0) {
dos.write(buffer, 0, length);
// 关闭流和Socket
fis.close();
dos.close();
socket.close();
System.out.println("文件发送完成");
} catch (IOException e) {
e.printStackTrace();
该代码创建了一个Socket对象,并连接到指定的主机和端口。然后使用DataOutputStream将文件名和文件长度发送到Socket中,并将文件内容发送到Socket中。最后关闭流和Socket。