java 服务器套接字文件传输
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/7696358/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Server socket file transfer
提问by Arun
I have used server socket concept in java to transfer files like images and videos. But when i receive at the client side, i am customizing the file names. Can i get the original name of the file as it is?
我在 java 中使用服务器套接字概念来传输图像和视频等文件。但是当我在客户端接收时,我正在自定义文件名。我可以按原样获取文件的原始名称吗?
For Example:
例如:
If the file from server end for transfer is "abc.txt", i need this same name to be reflected in the client end(without passing the name separately).
如果从服务器端传输的文件是“abc.txt”,我需要在客户端反映这个相同的名称(不单独传递名称)。
In the server end:
在服务器端:
public class FileServer {
public static void main (String [] args ) throws Exception {
// create socket
ServerSocket servsock = new ServerSocket(13267);
while (true) {
System.out.println("Waiting...");
Socket sock = servsock.accept();
System.out.println("Accepted connection : " + sock);
OutputStream os = sock.getOutputStream();
new FileServer().send(os);
sock.close();
}
}
public void send(OutputStream os) throws Exception{
// sendfile
File myFile = new File ("C:\User\Documents\abc.png");
byte [] mybytearray = new byte [(int)myFile.length()+1];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
System.out.println("Sending...");
os.write(mybytearray,0,mybytearray.length);
os.flush();
}
}
In the client end:
在客户端:
public class FileClient{
public static void main (String [] args ) throws Exception {
long start = System.currentTimeMillis();
// localhost for testing
Socket sock = new Socket("127.0.0.1",13267);
System.out.println("Connecting...");
InputStream is = sock.getInputStream();
// receive file
new FileClient().receiveFile(is);
long end = System.currentTimeMillis();
System.out.println(end-start);
sock.close();
}
public void receiveFile(InputStream is) throws Exception{
int filesize=6022386;
int bytesRead;
int current = 0;
byte [] mybytearray = new byte [filesize];
FileOutputStream fos = new FileOutputStream("def");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
bos.flush();
bos.close();
}
}
采纳答案by phihag
Yes, simply transfer the metadata (in your case myFile.getName()
) before the actual file contents, and make client and server read and emit that metadata. It's a good idea to use established protocols, for example HTTPand its Content-Disposition
header.
是的,只需myFile.getName()
在实际文件内容之前传输元数据(在您的情况下),并使客户端和服务器读取并发出该元数据。使用已建立的协议是个好主意,例如HTTP及其Content-Disposition
标头。
回答by Peter Lawrey
For the receiver to know the file name, either:
为了让接收者知道文件名,可以:
a) it must assume it knows the name because it asked for it,
a) 它必须假设它知道名称,因为它要求它,
b) the server sends the name first as part of the stream.
b) 服务器首先将名称作为流的一部分发送。
If you invent a way to send information without actually sending it, let me know and we can become billionaires. We can call it 'computer telepathy'.
如果您发明了一种无需实际发送信息即可发送信息的方法,请告诉我,我们就可以成为亿万富翁。我们可以称之为“计算机心灵感应”。
回答by Vinit Shandilya
There is a simpler way to do this. Just wrap your input stream inside DataInputStream and use methods like .writeUTF(myFile.getName()). Similarly, you can read file name at receiver by applying .readUTF on DataInputStream. Here is a sample code: Sender:
有一种更简单的方法可以做到这一点。只需将您的输入流包装在 DataInputStream 中并使用 .writeUTF(myFile.getName()) 之类的方法。同样,您可以通过在 DataInputStream 上应用 .readUTF 来读取接收器的文件名。这是一个示例代码: 发件人:
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
DataInputStream dis = new DataInputStream(bis);
OutputStream os;
try {
os = socket.getOutputStream();
DataOutputStream dos = new DataOutputStream(os);
dos.writeUTF(myFile.getName());
.............////// catch exceptions
Receiver:
接收者:
InputStream in;
try {
bufferSize=socket.getReceiveBufferSize();
in=socket.getInputStream();
DataInputStream clientData = new DataInputStream(in);
String fileName = clientData.readUTF();
System.out.println(fileName);
................../////// catch exceptions
回答by Samir Mangroliya
see this references,May be helpful...
请参阅此参考资料,可能会有所帮助...
http://www.rgagnon.com/javadetails/java-0542.html
http://www.rgagnon.com/javadetails/java-0542.html
http://www.java2s.com/Code/Java/Network-Protocol/TransferafileviaSocket.htm
http://www.java2s.com/Code/Java/Network-Protocol/TransferafileviaSocket.htm