Я написал программу сокета Java, в которой две строки должны быть переданы серверу со стороны клиента. Сервер вернет объединенную строку и длину объединенной строки. Цель состоит в том, чтобы отправить на сервер строку «exit», чтобы закрыть соединение после получения желаемого результата. Я получаю желаемый результат (сервер отправляет объединенную строку и размер), но на стороне сервера появляется ошибка.
Я также получаю четыре копии введенных мной строк на стороне сервера вместо одной.
Вот выходной снимок экрана

Вот мой код на стороне сервера:
import java.io.*;
import java.net.*;
public class Provider1{
ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
String message;
String x = "";
int count=0;
Provider1(){}
void run()
{
try{
//1. creating a server socket
providerSocket = new ServerSocket(2004, 10);
//2. Wait for connection
System.out.println("Waiting for connection");
connection = providerSocket.accept();
System.out.println("Connection received from " + connection.getInetAddress().getHostName());
//3. get Input and Output streams
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
sendMessage("Connection successful");
//4. The two parts communicate via the input and output streams
do{
try{
message = "";
message = (String)in.readObject();
System.out.println("client>" + message);
x+=message;
count++;
if (count==2)
{
sendMessage("The concatenated string : "+x);
sendMessage("The length of concatenated string : "+x.length());
message = "exit";
}
if (message.equals("exit"))
sendMessage(message);
}
catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
}
}while(!message.equals("exit"));
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
providerSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
public static void main(String args[])
{
Provider1 server = new Provider1();
while(true)
{
server.run();
}
}
}
Это мой код на стороне клиента
import java.io.*;
import java.net.*;
public class Requester1{
Socket requestSocket;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Requester1(){}
void run()
{
try{
//1. creating a socket to connect to the server
requestSocket = new Socket("localhost", 2004);
System.out.println("Connected to localhost in port 2004");
//2. get Input and Output streams
out = new ObjectOutputStream(requestSocket.getOutputStream());
out.flush();
in = new ObjectInputStream(requestSocket.getInputStream());
//3: Communicating with the server
do{
try{
message = (String)in.readObject();
System.out.println("server>" + message);
sendMessage("Hello");
sendMessage("There");
message = "exit";
sendMessage(message);
}
catch(ClassNotFoundException classNot){
System.err.println("data received in unknown format");
}
}while(!message.equals("exit"));
}
catch(UnknownHostException unknownHost){
System.err.println("You are trying to connect to an unknown host!");
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
requestSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
//System.out.println("client>" + msg);
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
public static void main(String args[])
{
Requester1 client = new Requester1();
client.run();
}
}




Ваш цикл чтения продолжается до тех пор, пока не будет прочитан "bye", и клиент не закроет сокет, не отправив его. Вот что происходит.
Вам просто нужно сделать свой код чтения более надежным, явно перехватывая EOFException и завершая цикл чтения, когда вы его получаете.
Вашему клиенту также необходимо читать сообщения, которые ему отправляются. В противном случае вы спровоцируете сброс соединения.
@Piotr Если это комментарий, он должен быть адресован OP. Если это ответ, его следует опубликовать как ответ. Если это комментарий к моему ответу, это лишний раз.
@Piotr В моем ответе нет раздела «Он хочет отправить ответ, но его никто не слушает». Это твои слова. Это раздел в вашем комментарии. Итак, ваш комментарий является продолжением вашего комментария? Значит, непонятен ваш собственный комментарий? В этом нет никакого смысла. И это не имеет никакого отношения к реальной проблеме.
Верно, скопировал и вставил неправильный фрагмент. Я хотел вставить этот «клиент также должен читать сообщения, которые ему отправляются». Я думаю, что для пользователя 3804152 может быть непонятно, каков точный поток сообщений между клиентом и сервером, и что это означает, что ему нужно прочитать отправляемое сообщение (учитывая, что его / ее код в целом имеет низкое качество , Я предполагаю, что для объяснения проблемы необходим обширный пример). Не стесняйтесь проголосовать против моего комментария, если считаете, что это необходимо :-)
@Piotr "Что значит читать" - это не вопрос, на который нужно отвечать. Он уже читает сообщения в своем существующем коде.
Не размещайте здесь изображения текста. Пустая трата вашего времени и нашей пропускной способности. Разместите текст.