DataInputStream readLong()得到了错误的值



嗨,我在DataInputStream.readLong()方法上遇到了一些问题。当我通过DataOutputStream.writeLong()输入一个值时,它是正确的值,但当它被发送时,它比它应该的大得多,我把代码都放在一个可运行的状态中,这样程序就不会冻结

这是客户端

socket = new Socket(ipAddress, Port);
bos = new BufferedOutputStream(socket.getOutputStream());
dos = new DataOutputStream(bos);
File f = new File("C:/Users/lukeLaptop/Downloads/RemoveWAT22.zip");
long length = f.length();
dos.writeLong(length);
String name = f.getName();
dos.writeUTF(name);
FileInputStream fis = new FileInputStream(f);
bis = new BufferedInputStream(fis);
int theByte = 0;
while ((theByte = bis.read()) != -1) {
bos.write(theByte);
}
bis.close();
dos.close();

服务器端

ServerSocket server = new ServerSocket(8080);
while (true) {
socket = server.accept();
System.out.println("Got a client !");
bis = new BufferedInputStream(socket.getInputStream());
dis = new DataInputStream(bis);
int filesCount = dis.readInt();

long fileLength = dis.readLong();
//String fileName = dis.readUTF();
File f = new File("C:/test/here/test.zip");
FileOutputStream fos = new FileOutputStream(f);
BufferedOutputStream bos = new BufferedOutputStream(fos);
for (int j = 0; j < fileLength; j++) {
bos.write(bis.read());
}
bos.close();
dis.close();

编辑

如果有人能帮我写代码,我很感激我是套接字的新手,我对一些事情有点困惑,我只想使用dataoutputstream的writeLong方法发送文件的长度,并使用writeUTF发送名称,但我不知道发生了什么,也不知道如何修复

问题在于方法writeUTF

javadoc说:

使用修改后的UTF-8将字符串写入基础输出流以独立于机器的方式进行编码。

首先,将两个字节写入输出流,就好像writeShort方法,给出要跟随的字节数。此值为实际写入的字节数,而不是一串在长度之后输出字符串的每个字符,按顺序,对字符使用修改后的UTF-8编码。如果不会引发异常,写入的计数器将按写入输出流的总字节数。这将在至少两加str的长度,最多两加三倍str.的长度

但是您使用自己的长度编码,只接受字符串包含的字符数。它不使用字符串的编码长度。

如果使用DataInputStream.readUTF()读取字符串,则不必使用自己的长度编码。

服务器发送此消息:

dos.writeLong(length);
dos.writeUTF(name);

然后是文件。

客户端读取此:

int filesCount = dis.readInt();
long fileLength = dis.readLong();
//String fileName = dis.readUTF();

然后是文件。

因此,您正在读取根本没有发送的filesCount,而不是正在发送的fileName。那么它怎么可能工作呢?

若你们并没有准确地阅读你们发送的内容,那个么用互补的方法是行不通的。

相关内容

  • 没有找到相关文章

最新更新