1

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
yaken
  • 559
  • 4
  • 17
Orcun
  • 1,031
  • 1
  • 10
  • 15
  • 'It gives "Couldn't get I/O for the connection to: localhost" exception.' No it doesn't. That is a stupid message of your own devising, or copied from an ancient Sun tutorial. Print the message that comes with the exception. That will tell you what happened. When you get an exception, don't make up your own message. There a better one provided, that is specific to the case. – user207421 Jun 07 '14 at 12:18
  • And don't flush inside the loop. – user207421 Feb 08 '19 at 22:02
  • It is five years old question. Isn't it obvious that it is an ancient one :) – Orcun Feb 08 '19 at 22:27

1 Answers1

0

You've read the input until end of stream in your 'while ' loop, then you're trying to read more input with readUTF(). There isn't any more. Something wrong with your application protocol here. You need to send the file length ahead of the file, and only read that many bytes when reading the sent file.

user207421
  • 305,947
  • 44
  • 307
  • 483