2013-06-29 5 views
0

Java 클래스의 경우 소켓을 사용하여 클라이언트와 서버간에 데이터를주고 받아야합니다. 문자열 데이터를 전달하는 예제를 얻을 수는 있지만 사용자 정의 클래스 객체 (즉, 제품)와 이러한 객체의 목록을 앞뒤로 전달할 수 있어야합니다. 서버 조각이 입력을 성공적으로 읽을 수 없습니다. 누군가가 문제를 정확하게 지적 할 수 있는지 확인하기 위해 간단한 코드 예제를 만들려고했습니다. 나는 코드가 완전하지는 않다는 것을 이해하지만, 클래스가 스트림에 쓰는 객체를 서버가 읽도록 할 수 없다 (이 경우, 그것을 얻기 위해 문자열을 작성하고있다. 작업하지만 객체를 읽고 쓰는 것이 필요함). 여기 내 코드가있다. 나는 이것을 시도하고 다른 사람들의 질문과 답변을 연구하는데 몇 시간을 보냈지 만, 여전히이 일을 할 수는 없습니다. 여기ObjectInputStream을 통한 소켓 구현 - 객체를 읽을 수 없습니다.

샘플 코드 :

간단한 서버 :

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class simpleServer { 

    public static final int PORT_NO = 8888; 
    static ObjectInputStream serverReader = null; 


    public static void main(String[] args) throws IOException, InterruptedException { 

     ServerSocket serverSocket = new ServerSocket(PORT_NO); 
     System.out.println("... server is accepting request"); 
     Object myObject = null; 
     while (true) { 
      Socket socket = serverSocket.accept(); 
      System.out.println("creating reader"); 
      ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 
      serverReader = new ObjectInputStream(socket.getInputStream()); 
      System.out.println("created reader"); 
      try { 
       System.out.println("try to read"); 
       myObject = serverReader.readObject(); 
       System.out.println("read it"); 
       System.out.println(myObject); 
       if (myObject != null) objOut.writeUTF("Got something"); 
       else objOut.writeUTF("got nothing"); 
       if ("quit".equals(myObject.toString())) serverSocket.close(); 
      } catch (ClassNotFoundException e1) { 
       // TODO Auto-generated catch block 
       System.out.println("cath for readobject"); 
      } 
      catch (Exception e) { 

       System.out.println("other error"); 
       System.out.println(e.getMessage()); 
      } 
     } 

    } 
} 

간단한 클라이언트 :

코드는 읽기가 할려고 서버 측의 점에 실행 나타납니다
public static void main(String[] args) { 
    Socket socket; 
    try { 
     socket = new Socket("localhost", ProductDBServer.PORT_NO); 
     ObjectOutputStream objOut = new ObjectOutputStream(socket.getOutputStream()); 
     ObjectInputStream objIn = new ObjectInputStream(socket.getInputStream()); 

     objOut.writeUTF("loadProductsFromDisk"); 
     objOut.flush(); 
     String myString = objIn.toString(); 
     //System.out.println(myString); 
     if (!"quit".equals(objIn.toString().trim())) { 
      //System.out.println("reading line 1"); 
      String line; 
      try { 
       line = (String)objIn.readObject(); 
       //System.out.println("line is " + line); 
      } catch (ClassNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      objIn.close(); 
      //System.out.println("result: " + line); 
     } 

     System.out.println("closing socket"); 
     socket.close(); 

    } catch (UnknownHostException e) { 
     // TODO Auto-generated catch block 
     System.out.println("Unknownhostexception"); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     System.out.println("ioexception"); 
     e.printStackTrace(); 
    } 


} 

내가 보낸 물건, 그리고 나서 죽는 물건. 누군가 내가 잘못하고있는 것을 볼 수 있습니까? 이것은 할 수있는 간단한 일인 것처럼 보이지만 아직 작동시키지 못합니다. 어떤 도움을 주셔서 감사합니다!

+0

처음에는 String을 보낼 때 왜 서버와 클라이언트 간의 통신을 위해 ObjectStream을 사용했는지 궁금합니다. 둘째, UTF를 보낼 때 UTF, 객체를 읽지 않고 "myObject = serverReader.readObject();를 변경해야합니다. 서버에서 "myObject = serverReader.readUTF();"행 –

+0

그건 그랬어. 고맙습니다. 컨셉 증명을 위해 부분적으로 문자열을 보냈지 만 문자열과 객체를 모두 보내야하기 때문에 문자열을 보냈습니다. – Sheila

+0

질문을 게시 한 것은 이번이 처음입니다. 당신이 내 질문에 대답했다는 것을 보여주고 싶습니다,하지만 StackOverflow 도움이 내가해야한다고 말하는 방식으로는 찾을 수 없습니다. 당신이 대답하는 것보다 당신이 논평 한 것일 수도 있습니다 - 확실하지는 않지만 당신이 제 질문에 대답했음을 보여주고 싶습니다. 고맙습니다! – Sheila

답변

0

ObjectOutputStream에 객체를 쓰려면 writeObject()를 호출해야합니다.

writeUTF()가 아닙니다.

ObjectInputStream에서 객체를 읽으려면 readObject()를 호출해야합니다.

notString().

+0

고맙습니다. 위의 User2511414는 writeUTF를 수행 한 경우 readUTF 대신 readUTF가 필요하다는 것을 알려줍니다. 문자열과 객체를 모두 작성할 수 있어야하므로 문자열로 시작 했으므로 작동시킬 수 없습니다. 귀하의 의견에 감사드립니다! – Sheila