Приложение клиент-сервер Java выдает исключение «java.net.SocketException: сброс соединения» - PullRequest
0 голосов
/ 01 июня 2019

Я пытался создать приложение клиент-сервер, где клиент генерирует случайное число и отправляет на сервер n строк. Соединение закрыто, отправка строки «BYE». После этого сервер должен рассчитать общую длину полученных строк и распечатать ее.

Проблема в том, что когда мой клиент пытается подключиться к серверу, он выдает исключение «java.net.SocketException: Connection reset» и вылетает.

Вот мой код клиента:


import java.net.*;
import java.io.*;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClientStringa {

    public static void main(String[] args) {
        try{
            Socket socket = new Socket("localhost", 5555);
            PrintWriter out = new PrintWriter(socket.getOutputStream());
            Random r = new Random();

            int N = r.nextInt(100);

            for(int i=1;i<=N;i++){
                out.println("String" +i);    
            }
            out.flush();
        }
        catch (IOException ex) {
            Logger.getLogger(ClientStringa.class.getName()).log(Level.SEVERE, null, ex);    
        }
    }
}

Код моего сервера:


import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ServerStringa {
    public static void main(String[] args) {
        try {
            ServerSocket socket = new ServerSocket(5555);

            while(true){
                System.out.println("Waiting for client connections...");
                Socket client = socket.accept();    //connessione dei client
                ThreadStringa thread = new ThreadStringa(client);
                thread.start();             
            }

        } catch (IOException ex) {
            Logger.getLogger(ServerStringa.class.getName()).log(Level.SEVERE, null, ex);
        }   
    }  
}

И мой код потока (поскольку сервер должен отвечать на большее количество клиентов):


import java.net.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ThreadStringa extends Thread{
    Socket client;

    public ThreadStringa(Socket client) {
        this.client = client;
    }

    public void run(){
        try {
           // DataInputStream input = new DataInputStream(client.getInputStream());
            String message;
            int sum=0;

            InputStream input = client.getInputStream();
            InputStreamReader input2 = new InputStreamReader(input);
            BufferedReader in = new BufferedReader(input2);

            while((message= in.readLine()) != null){
                if(message.equals("BYE")){
                    break;
                }
                sum+=message.length();              
            }

            System.out.println("Total length of received strings: " + sum);   
            input.close();
            client.close();
        } 
        catch (IOException ex) {
            Logger.getLogger(ThreadStringa.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Полная ошибка, которую я получаю на консоли сервера:

java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at java.io.BufferedReader.readLine(Unknown Source)
        at serverstringa.ThreadStringa.run(ThreadStringa.java:27)

1 Ответ

0 голосов
/ 01 июня 2019

Вместо PrintWriter в клиентской программе вы должны использовать DataOutputStream для связи с сервером при программировании сокетов. Также не забудьте выполнить close () со стороны клиента. Я только изменил вашу клиентскую программу, вы можете проверить это.

import java.net.*;
import java.io.*;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClientStringa {

    public static void main(String[] args) {
        try{
            Socket socket = new Socket("localhost", 5555);
            DataOutputStream out=new DataOutputStream(socket.getOutputStream());
//            PrintWriter out = new PrintWriter(socket.getOutputStream());
            Random r = new Random();
            int N = r.nextInt(100);
            for(int i=1;i<=N;i++){
//                out.println("String" +i);
                out.writeUTF("String" +i);
            }
            out.flush();
            out.close();
        }
        catch (IOException ex) {
            Logger.getLogger(ClientStringa.class.getName()).log(Level.SEVERE, null, ex);    
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...