的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类也是如此。
事实证明,它的那样简单:
客户:
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 :)
有什么办法可以微调这个.. – TechDog 2016-12-07 15:41:16
外观到使用ObjectOutputStream或一些其他的方式来序列化你的对象。这个链接有一个聊天客户端的例子(http://www.javaworld.com/article/2076864/java-concurrency/building-an-internet-chat-system。html)修改它来发送数据对象而不是字符串。 – Dave 2014-10-01 21:28:01