在下载文件之前,通过套接字在客户端和服务器之间交换字符串

时间:2012-11-14 10:09:01

标签: java sockets

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

但问题是我想在文件下载之前在客户端和服务器之间交换一些消息(字符串)。 我在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();

在下载文件之前,如何安全地交换客户端和服务器之间的链接,以及文件可以安全下载之后。

Thanx提前

2 个答案:

答案 0 :(得分:1)

您创建连接的方式是编写原始数据但读取字符(Stream vs. Reader / Writer)。

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

另外,您也应该自己管理如何将字符串与数据分开。

答案 1 :(得分: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;
}