效果展示
网络编程 --使用UDP协议的简单聊天室
由于TCP协议是一种面向连接的协议,有三次挥手通信确认机制,且数据包没有代销限制,TCP协议确保在通信双方都收到对方确认信息的前提下,才开始为通信的双方传输信息(数据包)!
这样数据包的传输可以得到安全保障!所以简单的理解为安全的!当然一旦,出现网络问题,或者一些其他意外现象造成通信双方的连接出现异常或断开连接,使用TCP是不能传输信息的!
UDP不是一种面向连接的协议,就是说,在使用UDP协议进行数据交互的时候,彼此可以不连接,通信的一端突然地向另外一端发送数据包,但是对方没有启动接收程序,那么对方当时是收不到数据包的,或者当你发送数据的过程中,突然出现意外断网,停电等等意外现象,都有可能造成对方收不到信息!也就说,你发送的信息对方没收到,同时你也不知道对方有没有收到!这不好!
加载场景
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using System.Text; using Common; using UnityEngine.UI; using System; using System.Net; using UIWidgetsSamples; using UnityEngine.SceneManagement; namespace NS { ///<summary> /// 程序入口 ///</summary> public class GameMain : MonoSingleton<GameMain> { private InputField IPInputField; private InputField IPInputField1; //点击按钮 ButtonClientEnter初始化客户端服务类 private void Start() { transform.FindChildByName("ButtonClientEnter"). GetComponent<Button>().onClick.AddListener(OnEnterChatScene); //获取进入按钮 transform.FindChildByName("ButtonServerEnter"). GetComponent<Button>().onClick.AddListener(OnEnterServerScene); // InputServerIPForClient IPInputField1 = transform.FindChildByName("" + "InputServerIPForClient").GetComponent<InputField>(); IPInputField = transform.FindChildByName("" + "InputServerIPForServer").GetComponent<InputField>(); //获取文本框 拿到IP } private void OnEnterServerScene() { UDPServerNetWorkService.Instance.Initialized(IPInputField.text); SceneManager.LoadScene("Server"); } //进去聊天室 private void OnEnterChatScene() { UDPClientNetWorkService.Instance.Initialized (IPInputField1.text); //获取IP 初始化客户都安 SceneManager.LoadScene("Chat"); //切换到聊天窗口 加载不删除 } //加载场景 } }
Date数据类
using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using System.Net.Sockets; using System.Text; using Common; using UnityEngine.UI; using System; using System.Net; using UIWidgetsSamples; using System.Runtime.Serialization.Formatters.Binary; namespace NS { ///<summary> ///聊天消息 ///</summary> [System.Serializable]//表示类可以被序列化 public class ChatMessage { //消息类型 0 1 2 枚举 public UDPNetWork Type { get; set; } //发送者名称 public string SenderName { get; set; } //消息内容 public string Content { get; set; } //如何把一个对象转字节数组??? //序列化:将对象状态存储到某种介质的过程(场景还原,网络交互) //存储介质:磁盘 内存 网络 //反序列化:将某种介质中的对象转换成C#对象 public byte [] ObjectToBytes() { //1.二进制写入器 往内存流去写 支持跨平台 //MemoryStream ms = new MemoryStream(); //BinaryWriter writer = new BinaryWriter(ms); //byte[] bys = Encoding.UTF8.GetBytes(SenderName); ////值类型 因为大小固定 所以直接Write ////引用类型 大小不固定 所以需要写入长度 //writer.Write(bys.Length); ////写入长度 //writer.Write(bys); //写入内容 //2.序列化 //使用Using 可以在退出代码块的时候 自动关闭非托管资源 using (MemoryStream ms = new MemoryStream()) { //内存流 BinaryFormatter fomatter = new BinaryFormatter(); //二进制格式化器 fomatter.Serialize(ms, this); //序列化 将当前对象序列化到内存流中 //byte[