Java Sockets - 发送对象并将对象分发给所有连接的客户端

2023-12-27

所以我在这里,有一个 3D 游戏,效果很好……

不过,我希望将其做成多人游戏。 我对套接字非常陌生,所以我不完全了解如何使用它们,更具体地说,如何将对象从客户端发送到服务器,然后将该对象分发给所有其他客户端。

这是我制作的想要发送的对象:

public class Vector3f{

    int x, y, z;

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

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

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

在 Client 类中,类似:

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.

实际上,在我的游戏中,我不会改变服务器的位置(除非我想用命令或其他东西来tp它们),只是将其重新分发给其他客户端,但是我希望首先看到它已经工作的证据:)

最后,在 Client 类中,它将接收新的 Position 并分配另一个对象以等于从服务器接收的对象,并执行如下操作:

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

任何帮助都是极好的。请记住,这还没有放入我的游戏中,所以现在只有这 3 个类,其中 Client 类有自己的 main 方法,Server 类也有。


事实证明,它很简单:

Client:

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);

Server:

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

then:

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 类中实现 Serialized :)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Sockets - 发送对象并将对象分发给所有连接的客户端 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Spring @RequestMapping 带有可选参数

    我的控制器在请求映射中存在可选参数的问题 请查看下面的控制器 GetMapping produces MediaType APPLICATION JSON VALUE public ResponseEntity
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • JGit 检查分支是否已签出

    我正在使用 JGit 开发一个项目 我设法删除了一个分支 但我还想检查该分支是否已签出 我发现了一个变量CheckoutCommand但它是私有的 private boolean isCheckoutIndex return startCo
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 按日期对 RecyclerView 进行排序

    我正在尝试按日期对 RecyclerView 进行排序 但我尝试了太多的事情 我不知道现在该尝试什么 问题就出在这条线上适配器 notifyDataSetChanged 因为如果我不放 不会显示错误 但也不会更新 recyclerview

随机推荐