2013-10-01 2 views
0

Я хочу отправить/получить 12 объектов между клиентом/сервером с использованием TCP. Объекты уникальны, но последовательность всегда одна и та же. Например: клиент всегда начинает с отправки «объекта 1», и сервер всегда отвечает «объектом 2.». Как настроить очередь или стек для этого и синхронизировать отправку/получение объектов, используя только стандартную библиотеку java? Я работал над кодом ниже (3 класса файлов из 1 пакета), и он не работает (конец ошибки файла), но он показывает, где я до:Java, отправляющий объекты из очереди или стека через сокет TCP

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

class SimpleClient { 
    public static void main(String args[]){ 
     int counter = 0; 
     try{ 
      Socket s = new Socket("localhost",2002); 
      OutputStream os = s.getOutputStream(); 
      ObjectOutputStream oos = new ObjectOutputStream(os); 
      testobject to = new testobject(1,"object 1","field1","field2","field3","field4"); 
      System.out.println("sending object 1"); //debug 
      oos.writeObject(to); 
      //Socket ss = s.accept(); 
      InputStream is = s.getInputStream(); 
      ObjectInputStream ois = new ObjectInputStream(is); 
      testobject too = (testobject)ois.readObject(); 
      while (counter != 2) { 
       while (too.value != 3) { 
        if (to==null) { 
         System.out.println("object is null!"); 
        } else if (to.value==1){ 
         System.out.println("receiving object 2"); //debug 
         System.out.println(to.id); 
         os = s.getOutputStream(); 
         oos = new ObjectOutputStream(os); 
         testobject to0 = new testobject(2,"object 3","field1","field2","field3","field4"); 
         oos.writeObject(to0); 
         System.out.println("object 3 sent!"); 
        } else if (to.value==2){ 
         System.out.println("receiving object 4"); //debug 
         System.out.println(to.id); 
         os = s.getOutputStream(); 
         oos = new ObjectOutputStream(os); 
         testobject to0 = new testobject(3,"object 5","field1","field2","field3","field4"); 
         oos.writeObject(to0); 
         System.out.println("sending object 5"); 
        } 
       } 
       is.close(); 
       s.close(); 
       //System.out.println((String)ois.readObject()); 
       counter = counter + 1; 
      } 
      oos.close(); 
      os.close(); 
      s.close(); 
     } catch(Exception e) { 
      System.out.println(e); 
     } 
    } 
} 

class SimpleServer { 
    public static void main(String args[]) { 
     int port = 2002; 
     int counter = 0; 
     try { 
      ServerSocket ss = new ServerSocket(port); 
      while (counter != 1) { 
       Socket s = ss.accept(); 
       InputStream is = s.getInputStream(); 
       ObjectInputStream ois = new ObjectInputStream(is); 
       testobject to = (testobject)ois.readObject(); 
       while (to.value != 1) { 
        if (to==null) { 
         System.out.println("object is null!"); 
        } else if (to.value==1){ 
         System.out.println("receiving object 1"); //debug 
         System.out.println(to.id); 
         OutputStream os = s.getOutputStream(); 
         ObjectOutputStream oos = new ObjectOutputStream(os); 
         testobject to0 = new testobject(2,"object 2","field1","field2","field3","field4"); 
         oos.writeObject(to0); 
         System.out.println("sending object 2"); 
        } else if (to.value==2){ 
         System.out.println("receiving object 3"); //debug 
         System.out.println(to.id); 
         OutputStream os = s.getOutputStream(); 
         ObjectOutputStream oos = new ObjectOutputStream(os); 
         testobject to0 = new testobject(4,"object 4","field1","field2","field3","field4"); 
         oos.writeObject(to0); 
         System.out.println("sending object 4"); 
        } 
       } 
       is.close(); 
       s.close(); 
       counter = counter + 1; 
      } 
      ss.close(); 
     } catch(Exception e) { 
      System.out.println(e); 
     } 
    } 
} 

class testobject implements Serializable { 
    int value; 
    String id; 
    String field1; 
    String field2; 
    String field3; 
    String field4; 
    public testobject(int v, String s, String s1, String s2, String s3, String s4) { 
     this.value=v; 
     this.id=s; 
     this.field1 = s1; 
     this.field2 = s2; 
     this.field3 = s3; 
     this.field4 = s4; 
    } 
} 
+0

Вы должны улучшить это форматирование. Никто не прочитает это! – Fildor

+1

Извините, что вырезали/вставляем ошибку, глупо не проверяли. – Matt1993

+0

Не продолжайте создавать новые 'ObjectInputStreams' и' ObjectOutputStreams' над одним и тем же сокетом. Используйте те же самые для жизни сокета; и сначала создайте 'ObjectOutputStream'. – EJP

ответ

1

EOFException в коде

Проблема в том, что ваша while (to.value != 1). Сервер получает первый объект со значением 1. Он не выполняет это во время цикла, но закрывает его немедленно. Поэтому, когда клиент пытается создать ObjectInputStream из входного потока этого сокета, он встречает закрытое соединение, где он ожидает заголовок потока объекта. Таким образом, EOFException.

Реализация разговор

Самый простой способ осуществить разговор избегает петель в целом. В конце концов, вы выполняете цикл, но затем выполняете различие в пределах цикла для выполнения специального кода в каждом проходе. Вы также можете написать линейную программу и, если необходимо, включить общий код в вызовы методов, хотя ваш пример имеет мало общего кода.

class SimpleClient { 
    public static void main(String args[]) throws Exception { 

     // Connection setup 
     Socket s = new Socket("localhost",2002); 
     OutputStream os = s.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(os); 
     InputStream is = s.getInputStream(); 
     ObjectInputStream ois = new ObjectInputStream(is); 
     testobject to; 

     // Conversation 

     System.out.println("sending object 1"); 
     to = new testobject(1,"object 1","field1","field2","field3","field4"); 
     oos.writeObject(to); 

     System.out.println("receiving object 2"); 
     to = (testobject)ois.readObject(); 
     System.out.println(to.id); 

     System.out.println("sending object 3"); 
     to = new testobject(2,"object 3","field1","field2","field3","field4"); 
     oos.writeObject(to); 

     System.out.println("receiving object 4"); 
     to = (testobject)ois.readObject(); 
     System.out.println(to.id); 

     // Connection shutdown 
     ois.close(); 
     oos.close(); 
     s.close(); 
    } 
} 

class SimpleServer { 
    public static void main(String args[]) throws Exception { 

     // Connection setup 
     ServerSocket ss = new ServerSocket(2002); 
     Socket s = ss.accept(); // only handle a single connection 
     ss.close(); // so we can immediately stop listening for more 
     OutputStream os = s.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(os); 
     InputStream is = s.getInputStream(); 
     ObjectInputStream ois = new ObjectInputStream(is); 
     testobject to; 

     // Conversation 

     System.out.println("receiving object 1"); 
     to = (testobject)ois.readObject(); 
     System.out.println(to.id); 

     System.out.println("sending object 2"); 
     to = new testobject(2,"object 2","field1","field2","field3","field4"); 
     oos.writeObject(to); 

     System.out.println("receiving object 3"); 
     to = (testobject)ois.readObject(); 
     System.out.println(to.id); 

     System.out.println("sending object 4"); 
     to = new testobject(4,"object 4","field1","field2","field3","field4"); 
     oos.writeObject(to); 

     // Connection shutdown 
     ois.close(); 
     oos.close(); 
     s.close(); 
    } 
} 

очереди приема и отправки

Если вы действительно хотите, чтобы отправить вещи из очереди, вы можете просто перебирать его.

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

class SimpleClient { 
    public static void main(String args[]) throws Exception { 

     // Preparing the queues 
     List<testobject> sendQueue = Arrays.asList(
      new testobject(1,"object 1","field1","field2","field3","field4"), 
      new testobject(2,"object 3","field1","field2","field3","field4")); 
     List<testobject> receiveQueue = new ArrayList<testobject>(); 

     // Connection setup 
     Socket s = new Socket("localhost",2002); 
     OutputStream os = s.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(os); 
     InputStream is = s.getInputStream(); 
     ObjectInputStream ois = new ObjectInputStream(is); 
     testobject to; 

     // Conversation, we start by sending 
     for (testobject toSend: sendQueue) { 
      System.out.println("Sending " + toSend.id); 
      oos.writeObject(toSend); 
      testobject received = (testobject)ois.readObject(); 
      System.out.println("Received " + received.id); 
      receiveQueue.add(received); 
     } 

     // Connection shutdown 
     ois.close(); 
     oos.close(); 
     s.close(); 
    } 
} 

class SimpleServer { 
    public static void main(String args[]) throws Exception { 

     // Preparing the queues 
     List<testobject> sendQueue = Arrays.asList(
      new testobject(2,"object 2","field1","field2","field3","field4"), 
      new testobject(4,"object 4","field1","field2","field3","field4")); 
     List<testobject> receiveQueue = new ArrayList<testobject>(); 

     // Connection setup 
     ServerSocket ss = new ServerSocket(2002); 
     Socket s = ss.accept(); // only handle a single connection 
     ss.close(); // so we can immediately stop listening for more 
     OutputStream os = s.getOutputStream(); 
     ObjectOutputStream oos = new ObjectOutputStream(os); 
     InputStream is = s.getInputStream(); 
     ObjectInputStream ois = new ObjectInputStream(is); 
     testobject to; 

     // Conversation, we start by receiving 
     for (testobject toSend: sendQueue) { 
      testobject received = (testobject)ois.readObject(); 
      System.out.println("Received " + received.id); 
      receiveQueue.add(received); 
      System.out.println("Sending " + toSend.id); 
      oos.writeObject(toSend); 
     } 

     // Connection shutdown 
     ois.close(); 
     oos.close(); 
     s.close(); 
    } 
} 

Но так как в этом случае все данные известны впереди, вы можете сэкономить трафик сети, не перемежения вещи, но вместо того, чтобы посылать все данные на обоих концах сразу, используя отдельную нить, чтобы получить вещи , Однако это будет еще дальше от вашего примера, поэтому я не буду включать код для этого.

+0

Это ответ на ошибку EOF. Спасибо. Как насчет метода отправки/получения объектов в порядке от/до стека или очереди? – Matt1993

+0

@ Matt1993: Я думаю, что я не полностью понимаю ваш вопрос в этом отношении. С помощью стека и очереди я бы связал последовательность объектов, чтобы вы могли просто перебирать их. С другой стороны, ваш пример, похоже, указывает на какую-то форму диалога, где отправленное сообщение зависит от сообщения, полученного до этого. Я буду включать ответы на оба в моем сообщении. – MvG

+0

спасибо MvG оба ответа были бы полезны, но для справки, что я пытаюсь сделать, это эмулировать протокол установления связи TCP. клиент инициирует с client_hello и сервер отвечает server_hello, и каждый объект (например, server_hello) содержит поля (2-3 строки). – Matt1993

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