Мне нужна помощь в понимании того, почему я получаю исключение StreamCorruptedException: недопустимый код типа: AC - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь научиться работать с сокетами с java, поэтому я сделал простое клиент-серверное приложение. Работало нормально, пока я не попытался реализовать постоянное общение. Сейчас что-то не так на стороне клиента, но я не понимаю, что именно. Это вызывает это исключение:

java.io.StreamCorruptedException: invalid type code: AC

Насколько я понимаю, это исключение возникает, когда вы используете новый ObjectOutputStream для записи в существующий ObjectInputStream, который уже был использован другим ObjectOutputStream. Простите, если это глупый вопрос, но как и зачем я это делаю здесь? И как мне это решить? Сервер отлично работает с клиентом, который закрывает сокет только после одного запроса, но это не то, что я хочу. Кроме того, должен ли я каждый раз закрывать потоки после общения и создавать новые? Было бы это решением? Какая простая, тупая и очевидная вещь мне здесь не хватает?

Заранее спасибо.

Вот мой код.

Клиентская сторона:

import java.io.*;
import java.net.*;
import java.util.Scanner;

public class Client
{
    private Socket clientSocket;
    private ObjectOutputStream output;
    private ObjectInputStream input;

    private Socket createClient(String host, int port) throws IOException
    {
        clientSocket = new Socket(host, port);
        return clientSocket;       
    }

    private void closeStreams() throws IOException
    {
        input.close();
        output.close();
    }

    private String sendMessage() throws IOException
    {
        System.out.println("Type message: ");
        String str = new Scanner(System.in).nextLine();
        output.writeUTF(str);
        output.flush();
        System.out.println("Mensage sent: " + str);
        return str;
    }

    private void receveMessage() throws IOException
    {
        String str = input.readUTF();
        System.out.println("Answer: " + str + "\n");
    }

    private void sendSolicitation(Socket socket) throws IOException
    {               
        try
        {
            output = new ObjectOutputStream(socket.getOutputStream());
            input = new ObjectInputStream(socket.getInputStream());

            String str = null;

            while (!str.equals("."))
            {
                str = sendMessage();
                receveMessage();
            }

            closeStreams();
            socket.close();
        }
        catch (IOException e)
        {
            System.out.println("Ops, something went wrong.\n" + "Exception: " + e );
        }

    }

    public static void main(String[] args)
    {
        Client cliente = new Client();

        try
        {
            System.out.println("Initiating solicitation...");
            Socket socket = cliente.createClient("localhost", 5550);
            cliente.sendSolicitation(socket);
        }
        catch (IOException e)
        {
            System.out.println("Ops, something went wrong.\n" + "Exception: " + e );
        }
    }
}

На стороне сервера:

import java.io.*;
import java.net.*;

public class Server
{
    private ServerSocket serverSocket;
    private ObjectOutputStream output;
    private ObjectInputStream input;

    private void createServerSocket(int porta) throws IOException
    {
        serverSocket = new ServerSocket(porta);        
    }

    private void closeStreams() throws IOException
    {
        input.close();
        output.close();
    }

    private Socket waitForConection() throws IOException 
    {
        Socket socket = serverSocket.accept();
        return socket;
    }

    private void handleConnection(Socket socket) throws IOException
    {
        try
        {
            boolean bool = true;
            while(bool)
            {
                output = new ObjectOutputStream(socket.getOutputStream());
                input = new ObjectInputStream(socket.getInputStream());

                System.out.println("Waiting for message...");
                String message = input.readUTF();
                System.out.println("Message received: " + message);
                output.flush();
                System.out.println("Answer sent: " + formatMessage(message) + "\n");

                if (message.equals("."))
                {
                    bool = false;   
                }
            }

            closeStreams();
            socket.close();
        }
        catch (IOException e)
        {
            socket.close();
            System.out.println("Ops, something went wrong.\n" + "handleConnection.\n" + "Exception: " + e );
        }
    }

    private int countCharacters(String str)
    {
        int count = str.length();
        return count;
    }

    private String formatMessage(String str)
    {
        str = "Message has " + countCharacters(str) + " characters.";
        return str;
    }

    public static void main(String[] args)
    {
        Server servidor = new Server();

        try
        {
            servidor.createServerSocket(5550);
            System.out.println("Wating for connection...\n");
            Socket socket = servidor.waitForConection();
            System.out.println("Client connected.");
            servidor.handleConnection(socket);
            System.out.println("Protocol successful.\n");
            System.out.println("Connection closed.");
        }
        catch (IOException e)
        {
            System.out.println("Ops, something went wrong.\n" + "main.\n" + "Exception: " + e );
        }
    }
}
...