的Java套接字 - 发送对象和分配对象到连接

的Java套接字 - 发送对象和分配对象到连接

问题描述:

所以我在这里所有的客户端,用一个3D游戏,伟大工程和东西...的Java套接字 - 发送对象和分配对象到连接

不过,我想使它多玩家。 我对套接字很陌生,所以我不完全理解如何使用它们,更具体地说,如何将对象从客户端发送到服务器,然后将该对象分发给所有其他客户端。

这是我做的,我想发送的对象:

public class Vector3f{ 

    int x, y, z; 

    public Vector3f(int x, int y, int z){ 
     this.x = x; 
     this.y = y; 
     this.z = z; 
    } 
} 

(这是一个球员的位置) 客户端类将创建一个新的Socket只是为了我的本地IP,和端口1500(例如),而服务器将创建服务器套接字到端口1500(显然)。

我只想知道如何将此对象发送到服务器(或主机),然后服务器在其中编辑对象以具有不同的值,然后将其发回。例如:

客户端类中,是这样的:

Vector3f origionalpos = new Vector3f(0,0,0); 
System.out.println("x: "+origionalpos.x+" y: "+origionalpos.y+" z: "+origionalpos.z); 

ObjectOutputStream.writeObject(origionalpos); 

那么服务器会接受这一点,并修改对象,将其发送回来,这样的事情之前:

Vector3f obj = ObjectRecievedFromClient; 
obj.x+=10; 
obj.y+=10 
obj.z+=10 
ObjectOutputStream.writeObject(obj); 
//here I would also like to send to all clients who are connected. 

现实在我的游戏中,我不会改变服务器的位置(除非我想用命令或其他东西来敲击它们),只是将它重新分配给其他客户端,但是我希望看到证明它已经首先运行:)

于是最后,在客户端类,这样会得到新的位置,并指定另一个目的是等于从服务器接收的对象,做这样的事情:

Vector3f newpos = ObjectInputStream.readObject(); 
System.out.println("x: "+newpos.x+" y: "+newpos.y+" z: "+newpos.z); 

任何帮助将是真棒。请记住,这还没有投入到我的游戏中,因此现在只会是这3个类,其中Client类具有自己的主方法,Server类也是如此。

+1

外观到使用ObjectOutputStream或一些其他的方式来序列化你的对象。这个链接有一个聊天客户端的例子(http://www.javaworld.com/article/2076864/java-concurrency/building-an-internet-chat-system。html)修改它来发送数据对象而不是字符串。 – Dave 2014-10-01 21:28:01

事实证明,它的那样简单:

客户:

private Socket socket = null; 
private ObjectInputStream inStream = null; 
private ObjectOutputStream outStream = null; 
Vector3f v3f = new Vector3f(0,0,0); 

然后:

socket = new Socket("localHost", port); 

System.out.println("Player Position: " + v3f.x+","+v3f.y+","+v3f.z); 
outStream = new ObjectOutputStream(socket.getOutputStream()); 
outStream.writeObject(v3f); 

inStream = new ObjectInputStream(socket.getInputStream()); 
v3f = (Vector3f) inStream.readObject(); 
System.out.println("New Player Position: " + v3f.x+","+v3f.y+","+v3f.z); 

服务器:

private ServerSocket serverSocket = null; 
private Socket socket = null; 
private ObjectInputStream inStream = null; 
private ObjectOutputStream outStream = null; 
Vector3f v3f = null; 

则:

serverSocket = new ServerSocket(port); 

最后:

while (true) {  
    socket = serverSocket.accept(); 

    inStream = new ObjectInputStream(socket.getInputStream()); 
    v3f = (Vector3f) inStream.readObject(); 

    v3f.x += 10; 
    v3f.y += 10; 
    v3f.z += 10; 

    outStream = new ObjectOutputStream(socket.getOutputStream()); 
    outStream.writeObject(v3f);  
} 

哦,不要忘记在Vector3f类实现Serializable :)

+0

有什么办法可以微调这个.. – TechDog 2016-12-07 15:41:16