unity3d游戏网络服务器和客户端
想做网络游戏的小伙伴肯定找过 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游戏网络服务器和客户端相关推荐
- 【Unity3D进阶4-13】Unity3D PUN网络服务器开发
目录 [Unity3D从入门到进阶]文章目录及设置这个专栏的初衷 一.前言 Photon Unity Networking (PUN)是一种用于多人游戏的Unity软件包. 灵活的匹配可以让玩家进入房 ...
- unity的学习,准备搞一款mmo小游戏,服务器和客户端从零学
先学一下unity,mmo服务器框架到时候在学习一下,暂时服务器简单做一下 unity中生命周期 如代码所示,简单了解一下. using System.Collections; using Syste ...
- vc简易网络服务器、客户端实现
一.服务器部分代码 头文件:server.h #include <winsock2.h> #include <stdio.h> #include <windef.h> ...
- 快节奏多人在线游戏网络入门系列教程(2):客户端预测与服务器协调
简介 在上一篇文章中,我们简单介绍了权威服务器的体系.客户端发送交互信息给服务器,服务器周期性的更新游戏状态,然后返回游戏状态给客户端. 这个简单体系会导致用户发送命令时和屏幕渲染响应之间的延迟.产生 ...
- 手机游戏修改客户端服务器,游戏服务器 手机客户端
游戏服务器 手机客户端 内容精选 换一换 GaussDB(DWS) 提供的gsql命令行客户端,它的运行环境是Linux操作系统,在使用gsql客户端远程连接GaussDB(DWS) 集群之前,需要准 ...
- 视频教程-游戏网络编程必备知识-Unity3D
游戏网络编程必备知识 网名:海洋,CSDN社区讲师,3D游戏引擎开发者,IT讲师,计算机图形学方向研究生,曾在浙江大学CAD&CG;国家重点实验室学习.从事IT行业15年,主导或参与了18款大 ...
- Unity3D游戏开发之网络游戏服务器架构设计培训
下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改 ...
- Unity3D游戏开发之网络游戏服务器架构设计(如何做一名主程)
下面我们开始今天的Unity3D游戏开发技能. 初期学习目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好 ...
- 【python网络编程】创建TCP/UDP服务器进行客户端/服务器间通信
客户端/服务器网络编程介绍 套接字:通信端点 实例:客户端发送数据,接收服务器返回的时间戳 用Python 编写FTP 客户端程序 客户端/服务器网络编程介绍 软件服务器也运行在一块硬件之上,但是没有 ...
最新文章
- [uart]stty命令使用
- R语言ggplot2可视化:使用geom_line函数将dataframe中数据可视化为时间序列(或折线图)(Time Series Plot From a Data Frame)、添加标题、副标题
- linux命令行运行c程序,如何在Linux中编写和运行C程序
- 用好这6个新功能,让你的项目设计事半功倍
- linux stress 命令 模拟系统高负载
- 在Jetson Xavier NX安装中文输入法(googlepinyin中文输入法)
- gitclone 一个tag的地址_一个无锁队列和FreeList实现
- Hadoop系统架构
- (10) Hibernate懒加载详解
- rxjs 里的map operator
- < meta name=“viewport“ content=“width=device-width, initial-scale=1.0“>的解释
- python 查看当前目录_Python学习第156课--ls的运用、环境变量以及PATH
- (转)Spring Boot(六):如何优雅的使用 Mybatis
- PostgreSQL 给数据库添加用户
- iOS开发之CoreSpotlight框架的应用
- 《我是一只IT小小鸟》阅读笔记
- Mirth Connect 快速安装
- 达人评测 小米笔记本pro14和联想yoga14s 选哪个好
- 骗你不是人 硬盘传输速度提升100倍的方法
- 新月音标_又一个新月?