2014-02-16 80 views
2

我期待發送&從其他Java應用程序接收Java對象到&。此應用程序可能在另一臺機器上。我需要的是我運行多個Java遊戲服務器,並且需要它們全部與一箇中央服務器通信。我試着尋找一些關於如何做到這一點的指針,但什麼也沒找到。發送和接收Java對象

我想象你開始爲每個遊戲服務器創建一個新的線程,然後打開一個Socket到服務器。

回答

3

您需要:

ObjectOutputStreamObjectInputStream

要在你課堂上使用這些方法來實現所謂的 serializable接口

在這裏你要序列化employee類,即你可以分享員工的對象

演示:

public class employee implemetns serializable 
{ 
} 

public class SerializeDemo 
{ 
    public static void main(String [] args) 
    { 
     Employee e = new Employee(); 
     e.name = "Reyan Ali"; 
     e.address = "Phokka Kuan, Ambehta Peer"; 
     e.SSN = 11122333; 
     e.number = 101; 
     try 
     { 
     FileOutputStream fileOut = 
     new FileOutputStream("/tmp/employee.ser"); 
     ObjectOutputStream out = new ObjectOutputStream(fileOut); 
     out.writeObject(e); 
     out.close(); 
     fileOut.close(); 
     System.out.printf("Serialized data is saved in /tmp/employee.ser"); 
     }catch(IOException i) 
     { 
      i.printStackTrace(); 
     } 
    } 
} 


public class DeserializeDemo 
{ 
    public static void main(String [] args) 
    { 
     Employee e = null; 
     try 
     { 
     FileInputStream fileIn = new FileInputStream("/tmp/employee.ser"); 
     ObjectInputStream in = new ObjectInputStream(fileIn); 
     e = (Employee) in.readObject(); 
     in.close(); 
     fileIn.close(); 
     }catch(IOException i) 
     { 
     i.printStackTrace(); 
     return; 
     }catch(ClassNotFoundException c) 
     { 
     System.out.println("Employee class not found"); 
     c.printStackTrace(); 
     return; 
     } 
     System.out.println("Deserialized Employee..."); 
     System.out.println("Name: " + e.name); 
     System.out.println("Address: " + e.address); 
     System.out.println("SSN: " + e.SSN); 
     System.out.println("Number: " + e.number); 
    } 
} 

現在您可以簡單地將此文件發送到使用套接字的其他服務器或客戶端!

希望這有助於

+0

爲什麼downvote? – Nullpointer

+0

似乎有人在跟我們玩笑話。我們的答案都可以。不確定是誰在倒計時。 –

+0

認真的人!那些低估了我們的人請提供更準確的答案..我們真的很想閱讀你的答案! – Nullpointer

1

你應該看看
http://docs.oracle.com/javase/7/docs/api/java/io/DataOutputStream.html
http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html
http://docs.oracle.com/javase/7/docs/api/java/io/DataInputStream.html
http://docs.oracle.com/javase/7/docs/api/java/io/ObjectInputStream.html

您可以使用這些的應用程序之間發送/接收的原始值或對象。是的,您可以使用Thread(用於在服務器上同時處理2個或更多客戶端),Socket(作爲應用程序之間的通信通道)和ServerSocket(用於監聽來自服務器端客戶端的傳入連接)。

+0

Downvoted?爲什麼? –

+0

不是我,但感謝您的幫助! –

+0

由於對象會來回發送,雙方都需要監聽傳入的連接,這是否意味着每個遊戲服務器都需要有自己的端口?如果這樣會很痛苦 –

1

與其他答案不同,我不會建議ObjectStreams(儘管我不是downvoter)。當然,他們將是直接發送Java對象的一種方式,但您並不真的想要這樣做。與其他流相比,ObjectStreams也有點特別。

確定您需要在服務器/客戶端之間傳輸哪些信息,然後設計您的協議。你可以使用二進制協議,或者甚至發送類似JSON的東西,但發送完整的對象很可能不是最好的想法。

看來你沒有很多網絡的經驗,所以你應該從其他項目中查找一些例子。

+0

我同意這一點。在現實世界中,您希望使用一些可以通過代理和防火牆進行隧道傳輸的協議。作爲兩個選項,幾乎只剩下HTTP和HTTPS。之後,您將剩下很長的投票/彗星協議。像JSON這樣的文本數據比這種協議的二進制數據要好。 – RaviH

+0

謝謝,但我認爲這對我的需求來說過於複雜。我想我會使用ObjectStreams,而是發送數據包實例而不是完整的類。感謝您花時間發佈您的答案 –