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();
}
}
내가 보낸 물건, 그리고 나서 죽는 물건. 누군가 내가 잘못하고있는 것을 볼 수 있습니까? 이것은 할 수있는 간단한 일인 것처럼 보이지만 아직 작동시키지 못합니다. 어떤 도움을 주셔서 감사합니다!
처음에는 String을 보낼 때 왜 서버와 클라이언트 간의 통신을 위해 ObjectStream을 사용했는지 궁금합니다. 둘째, UTF를 보낼 때 UTF, 객체를 읽지 않고 "myObject = serverReader.readObject();를 변경해야합니다. 서버에서 "myObject = serverReader.readUTF();"행 –
그건 그랬어. 고맙습니다. 컨셉 증명을 위해 부분적으로 문자열을 보냈지 만 문자열과 객체를 모두 보내야하기 때문에 문자열을 보냈습니다. – Sheila
질문을 게시 한 것은 이번이 처음입니다. 당신이 내 질문에 대답했다는 것을 보여주고 싶습니다,하지만 StackOverflow 도움이 내가해야한다고 말하는 방식으로는 찾을 수 없습니다. 당신이 대답하는 것보다 당신이 논평 한 것일 수도 있습니다 - 확실하지는 않지만 당신이 제 질문에 대답했음을 보여주고 싶습니다. 고맙습니다! – Sheila