0

Я создаю клиент-серверное приложение, в котором сервер или клиент отправляет строки с помощью PrintStream и считывает строки с использованием BufferedReader/InputStreamReader. В конце концов, мне нужно либо отправить объект с сервера на клиент, либо наоборот, используя ObjectInputStream/ObjectOutputStream.Как переключиться между потоками ввода/вывода строк и потоками ввода-вывода объектов в Java?

Как переключиться с отправляющих/принимающих строк на объекты отправки/получения? Я получаю «недопустимый заголовок потока: 7372000E».

Вот поток часть клиента (я вырезал все исключения для краткости):

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
BufferedReader fromServer; 
PrintStream clientToServer; 
try { 
    fromServer = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    clientToServer = new PrintStream(sock.getOutputStream()); 
} catch (IOException e) { 
    System.out.println(e.getMessage()); 
    e.printStackTrace(); 
    return; 
} 

String username; 
String opcode; 
System.out.print(fromServer.readLine()); // MESSAGE 1 
username = in.readLine(); 
clientToServer.println(username); // MESSAGE 2 
System.out.println(fromServer.readLine()); // MESSAGE 3 
if (!username.matches("[a-zA-Z]\\w+")) { 
    return; 
} 
opcode = fromServer.readLine(); // MESSAGE 4 

Если заявление и файл вещь для opcode1, затем:

ObjectInputStream ois; 
ObjectOutputStream oos; 
UUID u = null; 
ois = new ObjectInputStream(new FileInputStream(f)); 
u = (UUID) ois.readObject(); 
oos = new ObjectOutputStream(sock.getOutputStream()); 
oos.writeObject(u); // MESSAGE 5 

Else заявление и больше файлов для opcode2, затем:

ObjectOutputStream oos; 
ObjectInputStream ois; 
UUID u; 
ois = new ObjectInputStream(sock.getInputStream()); 
u = (UUID) ois.readObject(); // MESSAGE 5 
System.out.println("UUID " + u.toString() + " received."); 
oos = new ObjectOutputStream(new FileOutputStream(f)); 
oos.writeObject(u); 
System.out.println("UUID " + u.toString() + " written to file."); 

Сервер выполняет следующие действия:

PrintStream output = new PrintStream(sock.getOutputStream()); 
BufferedReader input = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
output.println("Please enter your username: "); // MESSAGE 1 
username = input.readLine(); // MESSAGE 2 
output.println("Welcome back!"); // MESSAGE 3 
output.println("opcode1") OR output.println("opcode2") // MESSAGE 4 

opcode1 раздел:

ObjectInputStream ois = new ObjectInputStream(sock.getInputStream()); 
UUID local = (UUID) ois.readObject(); // MESSAGE 5 
if (user.getUUID().equals(local)) 
output.println("Your UUID is valid."); // MESSAGE 6 

opcode2 раздел:

ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream()); 
oos.writeObject(u.getUUID()); // MESSAGE 5 
output.println("You now have a UUID."); // MESSAGE 6 
+0

Не могли бы вы поделиться текущей реализации? –

+1

Строки также являются объектами. Вы не можете отправлять объекты все время? – NilsH

+0

@ LeonardBrünings Сделано. – NobleUplift

ответ

1

Если вы знаете, ваш будет посылать различные типы данных через поток, вы можете сделать свой собственный класс "YourMessage" который будет записывать то, что хранится в типе данных.

private ObjectOutputStream sOutput; 
private ObjectInputStream sInput; 

class YourMessage { 
    static final int STRINGTYPE = 0; OBJECTTYPE = 1; // etc 
    int type; 
    String str; 
    // Any other message types 

    // Constructor 
    public YourMessage(int type, String str){ 
     this.type = type; 
     this.str = str; 
     // etc 
    } 

    // Create Getters here 
    String getMessage(){ 
     return str; 
    } 

} 

Затем отправлять сообщения через поток objectoutput, как это:

sOutput.writeObject(new YourMessage(YourMessage.STRINGTYPE, message)); 

Тогда при получении этого на сервере,

ym = (YourMessage) sInput.readObject(); 

switch (ym.getType()) { 
    case YourMessage.STRINGTYPE: 
     // do something with - 
     ym.getMessage(); 
     break; 
    case // other types of messages 

 Смежные вопросы

  • Нет связанных вопросов^_^