0

大家好,我已经用 Java 实现了一个服务器客户端程序,以便客户端可以从服务器下载文件。

但问题是我想在文件下载之前在客户端和服务器之间交换一些消息(字符串)。我在 JAVA 中用来在它们之间交换字符串的任何东西都能够在它们之间交换字符串,但是文件没有正确下载。我不知道为什么。

下载文件的客户端代码:

byte[] b = new byte[1024];
int len = 0;
long  bytcount = 1024;

File fp = new File("/home/luv/Desktop/LUVSAXENA_IT.docx");

RandomAccessFile ra=new RandomAccessFile(fp,"rw");
ra.seek(0);
InputStream i = sock.getInputStream();

BufferedReader reader=new BufferedReader(new InputStreamReader(i));

InputStream is = sock.getInputStream();

while ((len = is.read(b, 0, 1024)) != -1) {
    System.out.println("len"+len+"\n");
      bytcount = bytcount + 1024;

      //decrypt

      ra.write(b, 0, len);
}
is.close();
ra.close();
sock.close();

发送文件的服务器代码:

byte[] buf = new byte[1024];

OutputStream os = sock.getOutputStream();

BufferedOutputStream out = new BufferedOutputStream(os, 1024);

File folder = new File("/home/luv/NetBeansProjects/Shared/");
File[] listoffiles=folder.listFiles();
String s;

int i=0;
File fp = new File("/home/luv/NetBeansProjects/Shared/LUVSAXENA_IT.docx");
RandomAccessFile ra = new RandomAccessFile(fp,"r");
long bytecount=1024;

while((i=ra.read(buf, 0, 1024)) != -1)
{

    bytecount += 1024;
    out.write(buf, 0, i);
    out.flush();
}
sock.shutdownOutput();
out.close();
ra.close();
sock.close();

在下载文件之前,我如何在客户端和服务器之间安全地交换字符串,以便之后可以安全地下载文件。

提前感谢

4

2 回答 2

1

您创建连接的方式是写入原始数据但读取字符(流与读取器/写入器)。

我建议使用ObjectInputStream/ObjectOutputStream或对文件使用 Base64 编码,然后使用Reader/ Writer

您还必须自己管理如何将字符串与数据分开。

于 2012-11-14T10:40:38.707 回答
1

您将需要某种既服务于客户端又能使用的协议。
最简单的方法是使用具有请求-响应模式的固定长度消息,例如,每个消息字符串有 10 个字节(Xes 此处显示空白):

Client sends    "HELLOXXXXX"
Server answers  "WELCOMEXXX"
Client sends    "GIMMEFILEX"
Server ansers   "SIZE=83736"
Client reads the next 83736 bytes
Client sends    "THANKYOUXX"
Server SENDS    "GOODBYEXXX"

这是一种帮助您读取固定长度数据的方法,它将阻塞直到读取所有数据。写入数据时,不需要任何特殊代码,直接写出来即可。

private byte[] readBytes(InputStream stream, int amount) throws IOException
{
  byte[] result = new byte[amount];

  int read = stream.read(result, 0, amount);
  if (read < 0)
  {
    throw new IOException("Can't read from socket");
  }
  while (read < amount)
  {
    int remaining = amount - read;
    int newRead = stream.read(result, read, remaining);
    if (newRead < 0)
    {
      throw new IOException("Can't read from socket");
    }
    read = read + newRead;
  }
  return result;
}
于 2012-11-14T10:43:44.610 回答