2013-05-21 55 views
1

System.out.println("Java is awesome!");通過java中的套接字發送序列化文件

請原諒我的熱情;我簡直無法相信Java有多強大,它不僅能夠保存對象(並加載它們),而且還能夠以其主要目的,通過網絡發送它們。這正是我必須做的,因爲我正在進行beta測試。在這個beta測試中,我給測試人員提供了一個遊戲版本,將數據保存爲大多數人不知道的地方(我們是開明的哈哈哈)中的對象。這可以很好地工作,除了它不是爲了長期堅持。但是,我可以通過一些客戶端/服務器與套接字的交互(我一無所知,直到我開始閱讀它,但我仍然無能爲力),收集他們的record.sercounter.bin文件(後者告訴我有多少個對象在record.ser中) 。我在網上看到的大多數例子(例如:http://uisurumadushanka89.blogspot.com/2010/08/send-file-via-sockets-in-java.html)都是以字節流的形式發送文件,即一些ObjectOutputStream和ObjectInputStream。這正是我目前使用的遊戲版本來保存/加載GameData。

對不起,這個冗長的介紹,但你知道我將不得不做的(步驟明智,所以我可以理解)實際發送整個文件。我是否需要逐字節地重建文件(或逐個對象)?

+1

您不發送文件,但發送序列化對象本身。所以在ObjectOutputStream下使用你的服務器套接字輸出流。 –

+0

我希望這是一個答案,所以我可以upvote它並將其標記爲接受的答案 –

回答

1

其實很簡單。只要讓你的對象可序列化,並創建一個ObjectOutputStream和ObjectInputStream,它們連接到你擁有的任何基礎流,比如FileInputStream等等。然後,只需將任何你想要的對象寫到流中,然後在另一邊讀取它。

繼承人爲你example

對於插座它會像

ObjectOutputStream objectOut = new ObjectOutputStream(serverSocket.getOutputStream()); 
ObjectInputStream objectIn = new ObjectInputStream(clientSocket.getInputStream()); 
+0

我已經完成了第一部分:使對象可序列化。事實上,這就是GameData如何存儲在計算機上;作爲序列化對象。你知道是否有任何方法跟蹤誰給我發送GameData(因爲互聯網上的任何人都可以這麼做)?哦,我從來沒有與客戶端 - 服務器交互或套接字搞混。 –

+0

這個問題更多的是與建議有關的問題:如果beta測試者的機器向我的計算機發送GameData(它會),這是否會使我的計算機成爲服務器,而他們的客戶端? //我的電腦會將他們的GameData寫入數據庫。 –

+1

任何人都可以將數據發送到您的套接字。 Socket = IP +端口,這是非常特定於你的。如果測試人員的計算機正在向您發送數據,則說明他們是服務器,而您是客戶端。 –

0

Java序列是一個非常強大的協議。 java.io.ObjectOutputStreamjava.io.ObjectInputStream是較高等級的課程,當然是用較低等級的課程包裝,例如FileInputStreamFileOutputStream。我的問題是,爲什麼你想在整個文件可以在Objects中讀取時逐字節地讀取文件。

下面是該過程的一個很好的解釋。

http://www.tutorialspoint.com/java/java_serialization.html

+0

逐字節讀取文件從來不是我的意圖。 –