想做网络游戏的小伙伴肯定找过 mirro ,Photon的工具 ,但是不是很好用,想自定义强一点,连外网服务器 资料很少或者没有。

我直接用java的netty做的udp服务器就实现了个简单的

实现了功能有

创建人物,人物移动可以同步。 登录后加载身边的人物。

代码

这个类初始化netty服务器 ,转发操作命令

package com.hewei.config;import cn.hutool.core.util.StrUtil;
import com.hewei.game.service.cmd.Command;
import com.hewei.game.vo.CmdVo;
import com.hewei.util.ScanSupport;
import com.hewei.util.SpringUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.CharsetUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import java.lang.reflect.Constructor;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class BootNettyUdpSimpleChannelInboundHandler extends SimpleChannelInboundHandler<DatagramPacket> {Logger logger = LoggerFactory.getLogger(BootNettyUdpSimpleChannelInboundHandler.class);Map<String, Constructor> commandMap = new HashMap<>();{ScanSupport scanSupport = SpringUtil.getBean(ScanSupport.class);try {Set<Class<?>> classes = scanSupport.doScan("com.hewei.game.service.cmd");for (Class<?> aClass : classes) {putCmdName((Class<? extends Command>) aClass);}} catch (Exception e) {throw new RuntimeException(e);}}void putCmdName(Class<? extends Command> clazz) throws NoSuchMethodException {String cmd = StrUtil.subBefore(clazz.getSimpleName(), "Cmd", true).toLowerCase();Constructor c = clazz.getConstructor(CmdVo.class);//获取有参构造commandMap.put(cmd, c);logger.info("putCmdName|{}", clazz);}@Overrideprotected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) throws Exception {try {ByteBuf content = Unpooled.copiedBuffer(packet.content());ByteBuf header = content.readBytes(50);String s1 = header.toString(CharsetUtil.UTF_8).trim();logger.info("channelRead0|{}", s1);String[] split = s1.split(":");String type = split[0];String userId = split[1];CmdVo cmdVo = new CmdVo().setContent(content).setCtx(ctx).setHeader(header).setPacket(packet).setUserId(userId);Command c = (Command) commandMap.get(type).newInstance(cmdVo);c.execute();} catch (Exception e) {logger.error("channelRead0", e);}}}

这个类是命令的公共父类

package com.hewei.game.service.cmd;import com.hewei.game.service.GameCtx;
import com.hewei.game.vo.CmdVo;
import com.hewei.util.ByteUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import lombok.extern.slf4j.Slf4j;import java.net.InetSocketAddress;@Slf4j
public abstract class AbsCmd implements Command {ChannelHandlerContext ctx;String senderUserId;DatagramPacket packet;ByteBuf content;ByteBuf header;InetSocketAddress sender;CmdVo cmdVo;public AbsCmd(CmdVo cmdVo) {this.cmdVo = cmdVo;this.ctx = cmdVo.ctx;this.senderUserId = cmdVo.userId;this.packet = cmdVo.packet;this.content = cmdVo.content;this.header = cmdVo.header;this.sender = this.packet.sender();}public void send2Sender(ByteBuf byteBuf) {byteBuf.setIndex(0, byteBuf.writerIndex());ctx.writeAndFlush(new DatagramPacket(Unpooled.copiedBuffer(byteBuf), packet.sender()));}public void sendSkipSender(ByteBuf byteBuf) {for (InetSocketAddress addr : GameCtx.login.values()) {if (addr.equals(packet.sender())) {continue;}byteBuf.retain();log.info("sendSkipSender-to|{}", addr);byteBuf.setIndex(0, byteBuf.writerIndex());ctx.writeAndFlush(new DatagramPacket(byteBuf, addr));}}public void sendAll(ByteBuf byteBuf) {for (InetSocketAddress addr : GameCtx.login.values()) {log.info("sendSkipSender-to|{}", addr);byteBuf.retain();byteBuf.setIndex(0, byteBuf.writerIndex());ctx.writeAndFlush(new DatagramPacket(byteBuf, addr));}}public ByteBuf createHeader(String str){byte[] padding = ByteUtil.padding(50, str.getBytes());System.out.println(new String(padding));return Unpooled.wrappedBuffer(padding);}
}

代码示例

unity3d的代码

代码太多我已经放到gitee

java

留言再给

u3d

https://gitee.com/nhniu/unity3d_udp

下一步要实现 心跳 ,战斗

unity3d游戏网络服务器和客户端相关推荐

  1. 【Unity3D进阶4-13】Unity3D PUN网络服务器开发

    目录 [Unity3D从入门到进阶]文章目录及设置这个专栏的初衷 一.前言 Photon Unity Networking (PUN)是一种用于多人游戏的Unity软件包. 灵活的匹配可以让玩家进入房 ...

  2. unity的学习,准备搞一款mmo小游戏,服务器和客户端从零学

    先学一下unity,mmo服务器框架到时候在学习一下,暂时服务器简单做一下 unity中生命周期 如代码所示,简单了解一下. using System.Collections; using Syste ...

  3. vc简易网络服务器、客户端实现

    一.服务器部分代码 头文件:server.h #include <winsock2.h> #include <stdio.h> #include <windef.h> ...

  4. 快节奏多人在线游戏网络入门系列教程(2):客户端预测与服务器协调

    简介 在上一篇文章中,我们简单介绍了权威服务器的体系.客户端发送交互信息给服务器,服务器周期性的更新游戏状态,然后返回游戏状态给客户端. 这个简单体系会导致用户发送命令时和屏幕渲染响应之间的延迟.产生 ...

  5. 手机游戏修改客户端服务器,游戏服务器 手机客户端

    游戏服务器 手机客户端 内容精选 换一换 GaussDB(DWS) 提供的gsql命令行客户端,它的运行环境是Linux操作系统,在使用gsql客户端远程连接GaussDB(DWS) 集群之前,需要准 ...

  6. 视频教程-游戏网络编程必备知识-Unity3D

    游戏网络编程必备知识 网名:海洋,CSDN社区讲师,3D游戏引擎开发者,IT讲师,计算机图形学方向研究生,曾在浙江大学CAD&CG;国家重点实验室学习.从事IT行业15年,主导或参与了18款大 ...

  7. Unity3D游戏开发之网络游戏服务器架构设计培训

    下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...

  8. Unity3D游戏开发之网络游戏服务器架构设计(如何做一名主程)

    下面我们开始今天的Unity3D游戏开发技能. 初期学习目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好 ...

  9. 【python网络编程】创建TCP/UDP服务器进行客户端/服务器间通信

    客户端/服务器网络编程介绍 套接字:通信端点 实例:客户端发送数据,接收服务器返回的时间戳 用Python 编写FTP 客户端程序 客户端/服务器网络编程介绍 软件服务器也运行在一块硬件之上,但是没有 ...

最新文章

  1. [uart]stty命令使用
  2. R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame)、添加标题、副标题
  3. linux命令行运行c程序,如何在Linux中编写和运行C程序
  4. 用好这6个新功能,让你的项目设计事半功倍
  5. linux stress 命令 模拟系统高负载
  6. 在Jetson Xavier NX安装中文输入法(googlepinyin中文输入法)
  7. gitclone 一个tag的地址_一个无锁队列和FreeList实现
  8. Hadoop系统架构
  9. (10) Hibernate懒加载详解
  10. rxjs 里的map operator
  11. < meta name=“viewport“ content=“width=device-width, initial-scale=1.0“>的解释
  12. python 查看当前目录_Python学习第156课--ls的运用、环境变量以及PATH
  13. (转)Spring Boot(六):如何优雅的使用 Mybatis
  14. PostgreSQL 给数据库添加用户
  15. iOS开发之CoreSpotlight框架的应用
  16. 《我是一只IT小小鸟》阅读笔记
  17. Mirth Connect 快速安装
  18. 达人评测 小米笔记本pro14和联想yoga14s 选哪个好
  19. 骗你不是人 硬盘传输速度提升100倍的方法
  20. 新月音标_又一个新月?

热门文章

  1. 电脑无法连接oppo手机热点
  2. 2019NOIP普及组题解
  3. 2018全国计算机网络竞赛试题,全国2018年10月04741计算机网络原理真题以及答案解析...
  4. 分享166个ASP源码,总有一款适合您
  5. lammps多孔结构
  6. 介于传统巨石服务与微服务之间的一种选择
  7. HbuilderX使用Git版本控制
  8. 对于整数取反(取负NEG)运算的理解
  9. docker安装pg数据库及pg数据库基本操作
  10. 文件夹批量改名,将文件夹名称小写字母转为大写字母