如何通过套接字发送文件? Java
How can I send files through sockets? Java
我正在尝试通过套接字发送文件,目前是从客户端到服务器。要写入的文件已创建,但当我打开它时,它是空的。另外,如果我在发送文件后向服务器发送一个字符串,我发送的内容会写入本应收到的文本文件中。
我只使用文本文件进行测试。
为什么会这样?我该如何更正它?
jbutton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File(System.getProperty("user.home")));
FileNameExtensionFilter filter = new FileNameExtensionFilter("*.Images", "jpg","gif","png","txt");
fc.addChoosableFileFilter(filter);
int result = fc.showSaveDialog(null);
if(result == JFileChooser.APPROVE_OPTION){
File selectedFile = fc.getSelectedFile();
String path = selectedFile.getAbsolutePath();
try {
userText.setText("Sending File: " + selectedFile);
file = new FileInputStream(path);
byte b[] = new byte[30000];
file.read(b,0,b.length);
os = connection.getOutputStream();
os.write(b,0,b.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
else if(result == JFileChooser.CANCEL_OPTION){
System.out.println("No File Select");
}
}
//get stream to send and receive data
private void setupStreams() throws IOException{
output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
input = new ObjectInputStream(socket.getInputStream());
showMessage("\n Streams Are now Set up \n");
}
//during the chat conversation
private void whileChatting() throws IOException{
String message = "You are now connected ";
showMessage(message);
ableToType(true);
do {
try {
message = (String) input.readObject();
showMessage("\n" + message);
byte b[] = new byte[30000];
InputStream is = socket.getInputStream();
FileOutputStream fr = new FileOutputStream("C:\Users\Documents\TestingFileClientToServer.txt");
is.read(b,0,b.length);
fr.write(b,0,b.length);
}catch(ClassNotFoundException classNotFoundException) {
showMessage("\n Error on input \n");
}
}while(!message.equals("CLIENT - END"));
}
所以这是错误的(在两个地方):
fr.write(b,0,b.length);
您应该在读取调用中获取实际读取的字节数,并在写入调用中使用该大小。
这也是一个问题:
message = (String) input.readObject();
不要使用它,除非你真的在通过流发送对象......你不应该
关于回答为什么文件没有内容的问题:您需要在发送并刷新所有数据后关闭发送端的套接字。然后在接收方,您需要捕获 Socket 关闭的 SocketException,然后关闭您正在写入的文件。不关闭文件是您看不到任何内容的原因。
另一件事是您无缘无故地创建对象流。不要使用对象流,也不要使用数据流。只需使用原始 Input/Output 流。你不需要缓冲区,因为你正在做高效的读写。
我正在尝试通过套接字发送文件,目前是从客户端到服务器。要写入的文件已创建,但当我打开它时,它是空的。另外,如果我在发送文件后向服务器发送一个字符串,我发送的内容会写入本应收到的文本文件中。
我只使用文本文件进行测试。
为什么会这样?我该如何更正它?
jbutton.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent event) {
JFileChooser fc = new JFileChooser();
fc.setCurrentDirectory(new File(System.getProperty("user.home")));
FileNameExtensionFilter filter = new FileNameExtensionFilter("*.Images", "jpg","gif","png","txt");
fc.addChoosableFileFilter(filter);
int result = fc.showSaveDialog(null);
if(result == JFileChooser.APPROVE_OPTION){
File selectedFile = fc.getSelectedFile();
String path = selectedFile.getAbsolutePath();
try {
userText.setText("Sending File: " + selectedFile);
file = new FileInputStream(path);
byte b[] = new byte[30000];
file.read(b,0,b.length);
os = connection.getOutputStream();
os.write(b,0,b.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
else if(result == JFileChooser.CANCEL_OPTION){
System.out.println("No File Select");
}
}
//get stream to send and receive data
private void setupStreams() throws IOException{
output = new ObjectOutputStream(socket.getOutputStream());
output.flush();
input = new ObjectInputStream(socket.getInputStream());
showMessage("\n Streams Are now Set up \n");
}
//during the chat conversation
private void whileChatting() throws IOException{
String message = "You are now connected ";
showMessage(message);
ableToType(true);
do {
try {
message = (String) input.readObject();
showMessage("\n" + message);
byte b[] = new byte[30000];
InputStream is = socket.getInputStream();
FileOutputStream fr = new FileOutputStream("C:\Users\Documents\TestingFileClientToServer.txt");
is.read(b,0,b.length);
fr.write(b,0,b.length);
}catch(ClassNotFoundException classNotFoundException) {
showMessage("\n Error on input \n");
}
}while(!message.equals("CLIENT - END"));
}
所以这是错误的(在两个地方):
fr.write(b,0,b.length);
您应该在读取调用中获取实际读取的字节数,并在写入调用中使用该大小。
这也是一个问题:
message = (String) input.readObject();
不要使用它,除非你真的在通过流发送对象......你不应该
关于回答为什么文件没有内容的问题:您需要在发送并刷新所有数据后关闭发送端的套接字。然后在接收方,您需要捕获 Socket 关闭的 SocketException,然后关闭您正在写入的文件。不关闭文件是您看不到任何内容的原因。
另一件事是您无缘无故地创建对象流。不要使用对象流,也不要使用数据流。只需使用原始 Input/Output 流。你不需要缓冲区,因为你正在做高效的读写。