对于我正在使用的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,没有Object,只需改变“myObject = serverReader.readObject();”在服务器中用“myObject = serverReader.readUTF();” – 2013-06-29 15:58:12
就是这样。谢谢。我发送的字符串部分只是为了证明概念,但也因为我将不得不发送字符串和对象。 – Sheila
所以这是我第一次发布一个问题。我想表明你回答了我的问题,但我无法像StackOverflow帮助说的那样找到该选项。这可能是你评论而不是回答 - 我不确定,但我想表明你确实回答了我的问题。谢谢! – Sheila