2015-10-22 7 views
0

Я думаю, это потому, что когда я Многопоточной сервер клиента &, то DataOutputStream и DataInputStream буферы, которые я использую перезаписан или что-то подобное, так как розетка может иметь только 1 дуплексную связь ,Java Sockets - EOFException при попытке реализовать многопоточность

Вот что у меня есть сейчас: Class

клиента в моей программе клиента:

public static void main(String args[]) throws UnknownHostException, IOException, InterruptedException { 
     for (int i=0;i<2;i++) //change limit on i to change number of threads 
     { 
      new Thread(new ClientHandler(i)).start(); 
     } 
     Thread.sleep(10000); 

ClientHandler класс в моей клиентской программе: (Посылает значение на сервер, сервер будет эхо его назад). Класс

public class ClientHandler implements Runnable { 
public int clientNumber; 
public ClientHandler(int i){ 
    this.clientNumber=i; 
} 
public void run() { 
     Socket socket = null; 
     try { 
      socket = new Socket("localhost",9990); 
      System.out.println("connected client number "+clientNumber); 
      DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
      DataInputStream input = new DataInputStream(socket.getInputStream()); 
      output.writeDouble((new Random()).nextDouble()); 
      System.out.println(input.readDouble()); 
      } catch (UnknownHostException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      }finally{ 
       try { 
        socket.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

сервера в моей программе сервера:

ServerSocket socket = new ServerSocket(9990); 
    try { 
     while (true) { 
      Socket threadSocket = socket.accept(); 
      new Thread(new ServerHandler(threadSocket)).start(); 
      Thread.sleep(10000); 
} 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    finally { 
     socket.close(); 
     } 
    } 
} 

ServerHandler класса в моей программе сервера (принимает значение от клиента и эхо его обратно)

public class ServerHandler implements Runnable { 
    private Socket socket; 
    public ServerHandler(Socket socket) { 
    this.socket = socket; 
} 

public void run() { 
    while(true) { 
     try { 
      DataInputStream input = new DataInputStream(socket.getInputStream()); 
      DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
    double a = input.readDouble(); 
      output.writeDouble(a); 

}catch (IOException e){ 
     e.printStackTrace(); 

    } 
} 

}

Так это довольно прямолинейная реализация: создать несколько потоков клиента и подключить их к mul несколько потоков сервера.

Все отлично работает до линии:

double a = input.readDouble(); 

в моем классе ServerHandler.

я получаю EOFException

Я предполагаю, что это потому, что там может быть только один дуплексный соединение между гнездами. Но если это так, то как мне реализовать многопоточность сокетов?

Итак, мой вопрос: как я могу избавиться от исключения EOFException и позволить себе выполнять многопоточное взаимодействие со связью клиент-сервер?

(желательно не меняя моего кода, потому что мне понадобилось много времени, чтобы добраться до этой точки).

+0

Зачем вам нужен Thread.sleep (10000) ;? Кроме того, вы можете опубликовать трассировку стека? – Burkhard

+0

Я видел Thread.sleep (10000) в примере и просто использовал его - не совсем уверен, что он делает. Как отправить трассировку стека? – user83676

+0

e.printStackTrace(); печатает его в консоли. Просто скопируйте его в вопрос. – Burkhard

ответ

1

Проблема заключается в том, что вы разделяете ту же переменную Оправа в ServerHandler для всех потоков:

private static Socket socket 

Удалить статическую ключевое слово. Ваш ServerHandler будет примерно таким:

public static class ServerHandler implements Runnable { 
    private Socket socket; 

    public ServerHandler(Socket socket) { 
     this.socket = socket; 
    } 

    public void run() { 
     try { 
      DataInputStream input = new DataInputStream(socket.getInputStream()); 
      DataOutputStream output = new DataOutputStream(socket.getOutputStream()); 
      double a = input.readDouble(); 
      output.writeDouble(a); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+0

привет, спасибо, что ответили! Я удалил статическое ключевое слово, но я все еще получаю EOFExeption, когда пытаюсь запустить код. – user83676

+0

@ user83676 Можете ли вы обновить код, о котором идет речь, с вашими исправлениями? –

+0

Да! Я только что обновил его в своем оригинальном посте. – user83676

Смежные вопросы