java.io.EOFException 正在接收对象。通过套接字从客户端向服务器发送文件
java.io.EOFException while reciving a object. send file from client to server through socket
我正在创建一个可以通过套接字共享文件的 android 应用程序。首先,我正在创建一个服务器,它将 运行 在每个应用程序上,如果一个应用程序想要将文件发送给另一个用户,那么他可以 select 服务器 ip 地址并发送文件。
这里是服务器部分
public class ServerSocketThread extends Thread {
@Override
public void run() {
Socket socket = null;
try {
serverSocket = new ServerSocket(SocketServerPORT);
MessageActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
infoPort.setText("I'm waiting here: "
+ serverSocket.getLocalPort());
}});
while (true) {
socket = serverSocket.accept();
// FileTxThread fileTxThread = new FileTxThread(socket);
// fileTxThread.start();
//---------------------------------
ClientRxThread clientRxThread = new ClientRxThread(socket);
clientRxThread.start();
//----------------------------------------
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private class ClientRxThread extends Thread {
Socket socket = null;
ClientRxThread(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
File file;
ObjectInputStream ois;
ois = null;
InputStream in = null;
byte[] bytes;
FileOutputStream fos = null;
file = new File(getApplicationInfo().dataDir, "test.png");
try {
in = socket.getInputStream();
} catch (IOException ex) {
System.out.println("Can't get socket input stream. ");
}
try {
ois = new ObjectInputStream(in);
} catch (IOException e1) {
System.out.println("Can't get Object Input Stream. ");
e1.printStackTrace();
}
try {
assert ois != null;
bytes = (byte[])ois.readObject();
} catch (ClassNotFoundException | IOException e) {
System.out.println("Can't read Object . ");
bytes= new byte[0];
e.printStackTrace();
}
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e1) {
System.out.println("Can't get file output stream . ");
e1.printStackTrace();
}
try {
assert fos != null;
fos.write(bytes);
} catch (IOException e1) {
System.out.println("Can't file output stream write . ");
e1.printStackTrace();
}
finally {
if(fos!=null){
try {
fos.close();
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
MessageActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MessageActivity.this,
"Finished",
Toast.LENGTH_LONG).show();
}});
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这是客户端部分
private class ClientRxThread extends Thread {
String dstAddress;
int dstPort;
ClientRxThread(String address, int port) {
dstAddress = address;
dstPort = port;
}
@Override
public void run() {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
FileTxThread fileTxThread = new FileTxThread(socket);
fileTxThread.start();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class FileTxThread extends Thread {
Socket socket;
FileTxThread(Socket socket){
this.socket= socket;
}
@Override
public void run() {
File file = new File(newImageUri.getPath());
byte[] bytes = new byte[(int) file.length()];
BufferedInputStream bis;
try {
bis = new BufferedInputStream(new FileInputStream(file));
final int read = bis.read(bytes, 0, bytes.length);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(bytes);
oos.flush();
socket.close();
final String sentMsg = "File sent to: " + socket.getInetAddress();
FileSharingActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(FileSharingActivity.this,
sentMsg,
Toast.LENGTH_LONG).show();
}});
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我正在获取 java.io.EOFException 这部分的服务器。任何帮助都会很棒。
try {
ois = new ObjectInputStream(in);
} catch (IOException e1) {
System.out.println("Can't get Object Input Stream. ");
e1.printStackTrace();
对等方已关闭套接字,这导致接收方的流结束,从而导致 readObject()
中的 EOFException
。
这里有几个问题。服务器和客户端都不应关闭那些 finally
块中的 socket
:
- 服务器中的
finally
块应该关闭 serverSocket
,而不是 socket
,并且 socket should be a local variable in the
accept()` 循环,而不是在外部范围内。一旦循环迭代就没有意义了。
- 客户端应该在启动处理它的线程中关闭
socket
,而不是在启动线程的代码中。
- 客户甚至没有创建
ObjectOutputStream
,至少在您发布的代码中没有。如果您不打算在发送方使用 ObjectOutputStream
,则不能在接收方使用 ObjectInputStream
。
我正在创建一个可以通过套接字共享文件的 android 应用程序。首先,我正在创建一个服务器,它将 运行 在每个应用程序上,如果一个应用程序想要将文件发送给另一个用户,那么他可以 select 服务器 ip 地址并发送文件。
这里是服务器部分
public class ServerSocketThread extends Thread {
@Override
public void run() {
Socket socket = null;
try {
serverSocket = new ServerSocket(SocketServerPORT);
MessageActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
infoPort.setText("I'm waiting here: "
+ serverSocket.getLocalPort());
}});
while (true) {
socket = serverSocket.accept();
// FileTxThread fileTxThread = new FileTxThread(socket);
// fileTxThread.start();
//---------------------------------
ClientRxThread clientRxThread = new ClientRxThread(socket);
clientRxThread.start();
//----------------------------------------
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
private class ClientRxThread extends Thread {
Socket socket = null;
ClientRxThread(Socket socket) {
this.socket=socket;
}
@Override
public void run() {
File file;
ObjectInputStream ois;
ois = null;
InputStream in = null;
byte[] bytes;
FileOutputStream fos = null;
file = new File(getApplicationInfo().dataDir, "test.png");
try {
in = socket.getInputStream();
} catch (IOException ex) {
System.out.println("Can't get socket input stream. ");
}
try {
ois = new ObjectInputStream(in);
} catch (IOException e1) {
System.out.println("Can't get Object Input Stream. ");
e1.printStackTrace();
}
try {
assert ois != null;
bytes = (byte[])ois.readObject();
} catch (ClassNotFoundException | IOException e) {
System.out.println("Can't read Object . ");
bytes= new byte[0];
e.printStackTrace();
}
try {
fos = new FileOutputStream(file);
} catch (FileNotFoundException e1) {
System.out.println("Can't get file output stream . ");
e1.printStackTrace();
}
try {
assert fos != null;
fos.write(bytes);
} catch (IOException e1) {
System.out.println("Can't file output stream write . ");
e1.printStackTrace();
}
finally {
if(fos!=null){
try {
fos.close();
socket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
MessageActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MessageActivity.this,
"Finished",
Toast.LENGTH_LONG).show();
}});
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
这是客户端部分
private class ClientRxThread extends Thread {
String dstAddress;
int dstPort;
ClientRxThread(String address, int port) {
dstAddress = address;
dstPort = port;
}
@Override
public void run() {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
FileTxThread fileTxThread = new FileTxThread(socket);
fileTxThread.start();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(socket != null){
try {
socket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class FileTxThread extends Thread {
Socket socket;
FileTxThread(Socket socket){
this.socket= socket;
}
@Override
public void run() {
File file = new File(newImageUri.getPath());
byte[] bytes = new byte[(int) file.length()];
BufferedInputStream bis;
try {
bis = new BufferedInputStream(new FileInputStream(file));
final int read = bis.read(bytes, 0, bytes.length);
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
oos.writeObject(bytes);
oos.flush();
socket.close();
final String sentMsg = "File sent to: " + socket.getInetAddress();
FileSharingActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(FileSharingActivity.this,
sentMsg,
Toast.LENGTH_LONG).show();
}});
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
我正在获取 java.io.EOFException 这部分的服务器。任何帮助都会很棒。
try {
ois = new ObjectInputStream(in);
} catch (IOException e1) {
System.out.println("Can't get Object Input Stream. ");
e1.printStackTrace();
对等方已关闭套接字,这导致接收方的流结束,从而导致 readObject()
中的 EOFException
。
这里有几个问题。服务器和客户端都不应关闭那些 finally
块中的 socket
:
- 服务器中的
finally
块应该关闭serverSocket
,而不是socket
,并且socket should be a local variable in the
accept()` 循环,而不是在外部范围内。一旦循环迭代就没有意义了。 - 客户端应该在启动处理它的线程中关闭
socket
,而不是在启动线程的代码中。 - 客户甚至没有创建
ObjectOutputStream
,至少在您发布的代码中没有。如果您不打算在发送方使用ObjectOutputStream
,则不能在接收方使用ObjectInputStream
。