Reputation: 58
I a creating a an android app that can share files through socket. First I am creating a Server that will run on every app and if a one app wants to send a file to another user then he can select a server ip address and send file.
here is the server part
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();
}
}
}
}
Here is the client part
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();
}
}
}
}
I am getting java.io.EOFException of the server in this part. Any help would be great.
try {
ois = new ObjectInputStream(in);
} catch (IOException e1) {
System.out.println("Can't get Object Input Stream. ");
e1.printStackTrace();
Upvotes: 0
Views: 1308
Reputation: 310913
The peer has closed the socket, which causes end of stream at the receiver, which causes an EOFException
in readObject()
.
There are several problems here. Neither the server nor the client should close socket
in those finally
blocks:
finally
block in the server should close serverSocket
, not socket
, and socket should be a local variable in the
accept()` loop, not in the outer scope. It has no meaning once the loop has iterated.socket
in the thread that is started to handle it, not in the code that starts the thread.ObjectOutputStream
, at least not in the code you posted. If you're not going to use ObjectOutputStream
at the sender, you can't use ObjectInputStream
at the receiver.Upvotes: 1