Я пытаюсь научиться работать с сокетами с 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 );
}
}
}