我正在编写服务器和客户端文件传输模块,我想知道是否可以将文件信息与文件本身一起发送。特别是我需要将文件名和文件夹结构发送到客户端的服务器上。 防爆。如果我在服务器上有c:\ abc \ efg \ a.txt我想要。\ abc \ efg \ a.txt在客户端。
这是我正在使用的代码:
服务器端文件发送:
Socket clientSocket=new Socket("Some IP",12345);
OutputStream out=clientSocket.getOutputStream();
FileInputStream fis=new FileInputStream(file);
int x=0;
byte[] b = new byte[4194304];
while(true){
x=fis.read(b);
if(x==-1)break;
out.write(b);
}
out.close();
客户端侦听器:
try {
ServerSocket ss=new ServerSocket(12345);
while(true){
final Socket client = ss.accept();
new Thread(new Runnable() {
@Override
public void run() {
try{
InputStream in = client.getInputStream();
FileOutputStream fos = new FileOutputStream("rec.txt");
int x=0;
byte[] b = new byte[4194304];
while(true){
x=in.read(b);
if(x==-1)break;
fos.write(b);
}
fos.close();
}
catch(Exception e){
}
}
}).start();
}
} catch (Exception e) {
}
答案 0 :(得分:1)
首先发送标题,其中包含您需要的所有信息,然后是分隔符(例如0),然后是文件内容。服务器端读取标题直到分隔符,然后是内容。
答案 1 :(得分:1)
我以前做过这个。我在服务器上使用DataOutputStream,在客户端使用DataInputStream。
我使用了这个协议:
1.发送文件名.writeUTF(fileName);
2.发送文件大小.writeLong(fileSize);
3.发送文件.writeBytes(byteArray); //这是在for循环中完成的,因为文件大小太大而无法立即放入内存。服务器和客户端大小都将使用fileSize来确定何时停止。
客户端将使用相同的协议,但不是“写”,而是“读取”。
答案 2 :(得分:1)
你需要发送文件路径然后文件名,使用64字节缓冲区来做到这一点,一旦你得到路径和名称你读取文件内容。
例如:
// Server
try
{
Socket clientSocket=new Socket("Some IP",12345);
OutputStream out=clientSocket.getOutputStream();
FileInputStream fis=new FileInputStream(file);
byte[] info = new byte[64];
int len = file.getPath().length();
info = file.getPath().getBytes();
for (int i=len; i < 64; i++) info[i]=0x00;
out.write(info, 0, 64);
len = file.getName().length();
info = file.getName().getBytes();
for (int i=len; i < 64; i++) info[i]=0x00;
out.write(info, 0, 64);
int x;
byte[] b = new byte[4194304];
while((x=fis.read(b)) > 0)
{
out.write(b, 0, x);
}
out.close();
fis.close();
}
catch (Exception e)
{
e.printStackTrace();
}
// Client
try
{
InputStream in = client.getInputStream();
FileOutputStream fos = new FileOutputStream("rec.txt");
byte[] path = new byte[64];
in.read(path, 0, 64);
byte[] name = new byte[64];
in.read(name, 0, 64);
int x=0;
byte[] b = new byte[4194304];
while((x = in.read(b)) > 0)
{
fos.write(b, 0, x);
}
fos.close();
}
catch(Exception e)
{
e.printStackTrace();
}
答案 3 :(得分:0)
邮编
1。档案
2。有关文件的信息
发送)