Я думаю, это потому, что когда я Многопоточной сервер клиента &, то 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 и позволить себе выполнять многопоточное взаимодействие со связью клиент-сервер?
(желательно не меняя моего кода, потому что мне понадобилось много времени, чтобы добраться до этой точки).
Зачем вам нужен Thread.sleep (10000) ;? Кроме того, вы можете опубликовать трассировку стека? – Burkhard
Я видел Thread.sleep (10000) в примере и просто использовал его - не совсем уверен, что он делает. Как отправить трассировку стека? – user83676
e.printStackTrace(); печатает его в консоли. Просто скопируйте его в вопрос. – Burkhard