Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息
目录
一.目的
1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息
二.参考
1.unity3D中使用Socket进行数据通信(三)
三.操作:一:完成:在同一个Unity的同一个物体上面添加 服务端、客户端代码
1.下载
1.版本
1.运行结果+Unity设置
1.代码:MyNetTest03_SocketServer.cs
1.代码:MyNetTest03_SocketClient.cs
三.操作:二:完成:同一个电脑,都是编辑器中,一个是Unity服务端、一个是Unity客户端
1.版本
1.运行结果
1.服务端代码:MyNetTest04_SocketServer.cs
1.客户端代码:MyNetTest04_socketClient.cs
一.目的
1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息
二.参考
1.unity3D中使用Socket进行数据通信(三)
https://blog.csdn.net/qq_38112703/article/details/82624502
- 总结:good:下面操作也是借鉴这个文章
三.操作:一:完成:在同一个Unity的同一个物体上面添加 服务端、客户端代码
1.下载
Unity3D的TCP/socket通信.rar
1.版本
- unity2018.4.0f1
- vs2017
- windows10 64位
1.运行结果+Unity设置
- 总结:服务端、客户端代码都在一个物体上面,按下数字键1、2出现输出
1.代码:MyNetTest03_SocketServer.cs
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System;/// <summary>
/// 功能:scoket服务器监听端口脚本
/// </summary>
public class MyNetTest03_SocketServer : MonoBehaviour
{/// <summary>Thread:定义启动socket的线程</summary>private Thread thStartServer;/// <summary>string:ip地址</summary>private string str_ip = "192.168.43.167";/// <summary>string:ip的端口号</summary>private string str_port = "8080";void Start(){thStartServer = new Thread(StartServer);thStartServer.Start();//启动该线程}void Update(){}private void StartServer(){const int bufferSize = 8792;//缓存大小,8192字节//IPAddress ip = IPAddress.Parse("192.168.0.13");//TcpListener tlistener = new TcpListener(ip, 10001);TcpListener tlistener = new TcpListener(IPAddress.Parse(str_ip), int.Parse(str_port));tlistener.Start();Debug.Log("Socket服务器监听启动......");TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的客户端,阻塞方法Debug.Log("客户端已连接!local:" + remoteClient.Client.LocalEndPoint + "<---Client:" + remoteClient.Client.RemoteEndPoint);NetworkStream streamToClient = remoteClient.GetStream();//获得来自客户端的流do{try //直接关掉客户端,服务器端会抛出异常{//接收客户端发送的数据部分byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组int byteRead = streamToClient.Read(buffer, 0, bufferSize);//将数据搞入缓存中(有朋友说read()是阻塞方法,测试中未发现程序阻塞)if (byteRead == 0)//连接断开,或者在TCPClient上调用了Close()方法,或者在流上调用了Dispose()方法。{Debug.Log("客户端连接断开......");break;}string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法Debug.Log("服务端 接收数据:" + msg + ".数据长度:[" + byteRead + "byte]");}catch (Exception ex){Debug.Log("客户端异常:" + ex.Message);break;}}while (true);}void OnApplicationQuit(){thStartServer.Abort();//在程序结束时杀掉线程,想起以前老谢给我讲的,起线程就像拉屎,完事一定要记得自己擦,系统不会给你擦,经测试不擦第二次启动unity会无响应Debug.Log("程序结束了,杀掉thStartServer线程");}}
1.代码:MyNetTest03_SocketClient.cs
//using System.Collections;
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;public class MyNetTest03_SocketClient : MonoBehaviour
{/// <summary>string:ip地址</summary>private string str_ip_server = "192.168.43.167";/// <summary>string:ip的端口号</summary>private string str_port_server = "8080";TcpClient client;void Start(){}void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){Client();}if (Input.GetKeyDown(KeyCode.Alpha2)){SimulateMultiUserClient();}}private void Client(){client = new TcpClient();try{//client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞}catch (Exception ex){Debug.Log("客户端连接异常:" + ex.Message);}Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);//客户端发送数据部分for (int i = 0; i < 2; i++){try{string msg = "hello server i am No " + i;NetworkStream streamToServer = client.GetStream();//获得客户端的流byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送Debug.Log("客户端 发出消息:" + msg);}catch (Exception ex){Debug.Log("服务端产生异常:" + ex.Message);}}}private void SimulateMultiUserClient(){for (int i = 0; i < 2; i++){client = new TcpClient();try{//client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//连接到服务器端client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//连接到服务器端}catch (Exception ex)//抛出连接错误的异常{Debug.Log("客户端连接异常:" + ex.Message);}Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);//客户端发送数据部分string msg = "hello server i am No " + i;NetworkStream streamToServer = client.GetStream();//获得客户端的流byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送Debug.Log("发出消息:" + msg);}}}
三.操作:二:完成:同一个电脑,都是编辑器中,一个是Unity服务端、一个是Unity客户端
1.版本
- Unity2018.4.0f
- vs2017
- windos10 64
1.运行结果
- 同一个电脑,都是编辑器中,一个是服务端、一个是客户端
1.服务端代码:MyNetTest04_SocketServer.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System;
using System.Net.NetworkInformation;/// <summary>
/// 功能:scoket服务器监听端口脚本
/// </summary>
public class MyNetTest04_SocketServer : MonoBehaviour
{/// <summary>Thread:定义启动socket的线程</summary>private Thread thStartServer;/// <summary>string:ip地址</summary>private string str_ip_server = "192.168.43.167";/// <summary>string:ip地址</summary>//private string str_ip_server { set; get; }/// <summary>string:ip的端口号</summary>private string str_port_server = "12306";void Start(){// str_ip_server=// IPAddress//str_ip_server = Network.player.ipAddress;// str_ip_server =Net//string ip = GetIP();//Debug.Log("本机IP:" + ip);str_ip_server = GetIP();thStartServer = new Thread(StartServer);thStartServer.Start();//启动该线程}void Update(){}/// <summary>/// 获取本机IP/// </summary>/// <returns>string :ip地址</returns>public string GetIP(){string output = "";foreach (NetworkInterface item in NetworkInterface.GetAllNetworkInterfaces()){NetworkInterfaceType _type1 = NetworkInterfaceType.Wireless80211; //无线局域网适配器 if ((item.NetworkInterfaceType == _type1) && item.OperationalStatus == OperationalStatus.Up){foreach (UnicastIPAddressInformation ip in item.GetIPProperties().UnicastAddresses){if (ip.Address.AddressFamily == AddressFamily.InterNetwork){output = ip.Address.ToString();}}}}return output;}private void StartServer(){const int bufferSize = 8792;//缓存大小,8192字节//IPAddress ip = IPAddress.Parse("192.168.0.13");//TcpListener tlistener = new TcpListener(ip, 10001);TcpListener tlistener = new TcpListener(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));tlistener.Start();Debug.Log("Socket服务器监听启动......");TcpClient remoteClient = tlistener.AcceptTcpClient();//接收已连接的客户端,阻塞方法Debug.Log("客户端已连接!local:" + remoteClient.Client.LocalEndPoint + "<---Client:" + remoteClient.Client.RemoteEndPoint);NetworkStream streamToClient = remoteClient.GetStream();//获得来自客户端的流do{try //直接关掉客户端,服务器端会抛出异常{//接收客户端发送的数据部分byte[] buffer = new byte[bufferSize];//定义一个缓存buffer数组int byteRead = streamToClient.Read(buffer, 0, bufferSize);//将数据搞入缓存中(有朋友说read()是阻塞方法,测试中未发现程序阻塞)if (byteRead == 0)//连接断开,或者在TCPClient上调用了Close()方法,或者在流上调用了Dispose()方法。{Debug.Log("客户端连接断开......");break;}string msg = Encoding.Unicode.GetString(buffer, 0, byteRead);//从二进制转换为字符串对应的客户端会有从字符串转换为二进制的方法Debug.Log("服务端 接收数据:" + msg + ".数据长度:[" + byteRead + "byte]");}catch (Exception ex){Debug.Log("客户端异常:" + ex.Message);break;}}while (true);}void OnApplicationQuit(){thStartServer.Abort();//在程序结束时杀掉线程,想起以前老谢给我讲的,起线程就像拉屎,完事一定要记得自己擦,系统不会给你擦,经测试不擦第二次启动unity会无响应Debug.Log("程序结束了,杀掉thStartServer线程");}}
1.客户端代码:MyNetTest04_socketClient.cs
- 先打开Unity的服务端,在开启客户端
- 按下字母上面的1、2进行和服务端连接和发送消息
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;/ <summary>
/ 功能:单独的unity作为客户端,
/ </summary>
public class MyNetTest04_socketClient : MonoBehaviour
{/// <summary>string:ip地址</summary>private string str_ip_server = "192.168.43.167";/// <summary>string:ip的端口号</summary>private string str_port_server = "12306";TcpClient client;void Start(){}void Update(){if (Input.GetKeyDown(KeyCode.Alpha1)){Client();}if (Input.GetKeyDown(KeyCode.Alpha2)){SimulateMultiUserClient();}}private void Client(){client = new TcpClient();try{//client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//同步方法,连接成功、抛出异常、服务器不存在等之前程序会被阻塞}catch (Exception ex){Debug.Log("客户端连接异常:" + ex.Message);}Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);//客户端发送数据部分for (int i = 0; i < 2; i++){try{string msg = "hello server i am No " + i;NetworkStream streamToServer = client.GetStream();//获得客户端的流byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送Debug.Log("客户端 发出消息:" + msg);}catch (Exception ex){Debug.Log("服务端产生异常:" + ex.Message);}}}private void SimulateMultiUserClient(){for (int i = 0; i < 2; i++){client = new TcpClient();try{//client.Connect(IPAddress.Parse("192.168.0.13"), 10001);//连接到服务器端client.Connect(IPAddress.Parse(str_ip_server), int.Parse(str_port_server));//连接到服务器端}catch (Exception ex)//抛出连接错误的异常{Debug.Log("客户端连接异常:" + ex.Message);}Debug.Log("LocalEndPoint = " + client.Client.LocalEndPoint + ". RemoteEndPoint = " + client.Client.RemoteEndPoint);//客户端发送数据部分string msg = "hello server i am No " + i;NetworkStream streamToServer = client.GetStream();//获得客户端的流byte[] buffer = Encoding.Unicode.GetBytes(msg);//将字符串转化为二进制streamToServer.Write(buffer, 0, buffer.Length);//将转换好的二进制数据写入流中并发送Debug.Log("发出消息:" + msg);}}}
Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息相关推荐
- php监听mq消息,客户端监听服务端获取rabbitmq消息队列,rabbitmq有消息的时候客户端刷新页面才能获取到消息,监听没起到作用,请求各位大神指点迷津...
header("Content-Type:text/html;charset=utf-8"); use Workerman\Worker; require_once __DIR__ ...
- 【Unity3D Shader编程】之五 圣诞夜篇 Unity中Shader的三种形态对比 混合操作合辑
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 本系列文 ...
- grpc 客户端的context 服务端获取不到_MLamp;DEV[10] | gRPC的应用
上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈.首先上期内容在这 ...
- 附件统一处理starter,含附件客户端和附件服务端
文章目录 附件统一处理starter,可分别作为附件客户端和附件服务端使用 一 关于项目中附件的概述 二 概要描述 三 附件starter功能划分 3.1 附件服务器,真实的存储附件 3.1.1 为前 ...
- AjaxPro.NET使用,方便的在客户端直接调用服务端方法
(一). 运行效果如下: (二). AjaxPro.NET简介 AjaxPro.NET是一个优秀的Ajax框架, 在实际应用中只要添加其DLL引用并进行简单的配置, 即可以非常方便的在客户端直接调用服 ...
- 传奇手游三职业1.80合击服务端三端互通版搭建教程
传奇手游三职业1.80合击服务端三端互通版搭建教程 大家好,我是驰网艾西.随着时代的发展,以前我们热爱的传奇游戏也越来越没有时间玩了,到了一定的年纪大家都有自己的事业以及生活压力.以前我们总是玩PC端 ...
- python 服务端主动发数据_python使用socket向客户端发送数据的方法
Python Socket通讯例子详解 创新从模仿开始! python中内置的socket模块使得网络编程更加简单化,下面就通过两个小小脚本来了解客户端如何与服务器端建立socket. 客户端代码: ...
- http 缓存分为客户端缓存和服务端缓存
http 缓存分为客户端缓存和服务端缓存 1. 客户端缓存 客户端缓存指的是浏览器缓存, 浏览器缓存是最快的缓存, 因为它直接从本地获取(但有可能需要发送一个请求), 它的优势是可以减少网络流量, 加 ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
最新文章
- Web GIS系统相关
- php oauth2.0 实例,详解laravel passport OAuth2.0的4种模式
- CodeFirst实战:用文本数据库存档软件配置
- 【特征工程】(未完成)特征选择
- 服务器win2008修复安装,Win2008 R2迁移实战之迁移工具安装
- 垂直居中相关知识总结
- 汇编程序:将字符串中所有大写字符转为小写
- Analysis of Cloud Computing Architectures阅读笔记--提出了Screen虚拟化方法
- Spring注释事务失效及解决办法
- eclipse中The JSP specification requires that an attribute name is preceded by whitespace
- Java字符串替换前缀,从Bash中的字符串中删除固定的前缀/后缀
- mongoDB安装及使用
- [ios]iOS模拟器应用程序目录结构
- Linux内核分析——进程的描述和进程的创建
- python编程入门-编程零基础应当如何开始学习 Python?
- Vue.js 还是 React?你会选择哪一个?为什么?
- 如何修改云服务器连接密码错误,如何修改云服务器连接密码
- 易语言 mysql操作_易语言数据库应用手册
- 阿里云邮件推送使用方法
- HTML二级下拉菜单自动联动,html二级联动下拉菜单 [Excel函数如何制作二级联动下拉菜单]...