對於我正在使用的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