嗨我用readLong()
DataInputStream.
方法遇到了一些麻烦当我通过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发送名称,但我不知道发生了什么以及如何解决它
答案 0 :(得分:1)
问题是方法writeUTF
。
javadoc说:
使用修改后的UTF-8将字符串写入基础输出流 以与机器无关的方式进行编码。
首先,将两个字节写入输出流,就好像通过 writeShort方法给出要遵循的字节数。这个值是 实际写出的字节数,而不是长度 串。在长度之后,输出字符串的每个字符, 按顺序,使用修改后的UTF-8编码作为字符。如果 抛出没有异常,写入的计数器增加了 写入输出流的总字节数。这将是 至少两加上str的长度,最多加两次加三次 str的长度。
但是你使用自己的长度编码,只需要字符串包含的字符数。它不使用字符串的编码长度。
如果使用DataInputStream.readUTF()
来读取字符串,则不必使用自己的长度编码。
答案 1 :(得分:0)
服务器发送:
dos.writeLong(length);
dos.writeUTF(name);
后跟文件。
客户读到这个:
int filesCount = dis.readInt();
long fileLength = dis.readLong();
//String fileName = dis.readUTF();
后跟文件。
因此,您正在阅读一个您根本没有发送的filesCount
,而不是正在阅读您要发送的fileName
。那怎么可能有用呢?
如果您没有准确地阅读您发送的内容,使用补充方法,它将无效。