I'm new to socket programming and I have a problem that I can not understand. I am trying to send a file from server to client. After that, server and client start chatting until client says "Bye.". When I start the program, it works well until client sends the "Bye." message and closes its socket. It gives "Couldn't get I/O for the connection to: localhost" exception.
When I try to debug to see what's going on, it holds at while(at line 38) statement even if file transfer finishes. The file delivers correct.
Server Code:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class ServerTCP extends Thread
{
protected Socket clientSocket;
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(10008);
System.out.println ("Connection Socket Created");
try {
while (true)
{
System.out.println ("Waiting for Connection");
new ServerTCP (serverSocket.accept());
}
}
catch (IOException e)
{
System.err.println("Accept failed.");
System.exit(1);
}
}
catch (IOException e)
{
System.err.println("Could not listen on port: 10008.");
System.exit(1);
}
finally
{
try {
serverSocket.close();
}
catch (IOException e)
{
System.err.println("Could not close port: 10008.");
System.exit(1);
}
}
}
private ServerTCP (Socket clientSoc)
{
clientSocket = clientSoc;
start();
}
public void run()
{
System.out.println ("New Communication Thread Started");
// İlave kısım
DataInputStream dataIn = null;
DataOutputStream dataOut = null;
try {
//echoSocket = new Socket(serverHostname, 10008);
dataIn = new DataInputStream(clientSocket.getInputStream());
dataOut = new DataOutputStream(clientSocket.getOutputStream());
File file = new File("tmp.txt");
byte[] contents = new byte[1024];
FileInputStream fis = new FileInputStream(file);
int count = 0;
while( (count = fis.read(contents)) > 0 ){
dataOut.write(contents, 0, count);
dataOut.flush();
}
contents[0] = 0;
count = 1;
dataOut.write(contents, 0, count);
dataOut.flush();
Scanner sc = new Scanner(System.in);
String clientMessage = null;
while( !(clientMessage = dataIn.readUTF()).equals("Bye.") )
{
System.out.println(clientMessage);
dataOut.writeUTF(sc.nextLine());
}
sc.close();
fis.close();
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: ");
System.exit(1);
} finally {
try {
if (dataOut != null)
dataOut.close();
if(dataIn != null)
dataIn.close();
clientSocket.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
Client Code:
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws IOException {
String serverHostname = new String ("localhost");
if (args.length > 0)
serverHostname = args[0];
System.out.println ("Attemping to connect to host " +
serverHostname + " on port 10008.");
Socket echoSocket = null;
DataInputStream in = null;
DataOutputStream dataOut= null;
try {
echoSocket = new Socket(serverHostname, 10008);
in = new DataInputStream(echoSocket.getInputStream());
dataOut = new DataOutputStream(echoSocket.getOutputStream());
String clientMessage = "tmp";
File file = new File(clientMessage + "_got" + ".txt");
System.out.println(clientMessage + "_got" + ".txt created.");
FileOutputStream foStream = new FileOutputStream(file);
byte[] buff = new byte[1024];
int count = 0;
while ((count = in.read(buff)) > 0) {
if(buff[0] == 0)
break;
foStream.write(buff, 0, count);
foStream.flush();
}
Scanner keyboard = new Scanner(System.in);
String msg = "";
while(true){
msg = keyboard.next();
System.out.println("Client: " + msg);
dataOut.writeUTF(msg);
System.out.println("Server: " + in.readUTF());
if( msg.equalsIgnoreCase("Bye.") )
break;
}
System.out.println("asds");
} catch (UnknownHostException e) {
System.err.println("Don't know about host: " + serverHostname);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for "
+ "the connection to: " + serverHostname);
System.exit(1);
} finally {
try {
if (dataOut != null)dataOut.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
in.close();
echoSocket.close();
}
}
Edit
My exception is:
java.io.EOFException
at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:323)
at java.io.DataInputStream.readUTF(DataInputStream.java:572)
at java.io.DataInputStream.readUTF(DataInputStream.java:547)
at Client.main(Client.java:51)
Couldn't get I/O for the connection to: localhost