设为首页 加入收藏

TOP

UDP实现一个简易的聊天室(多个主机连接终端) 已完善(一)
2019-09-17 18:13:31 】 浏览:52
Tags:UDP 实现 一个 简易 聊天室 多个 主机 连接 终端 完善

 效果展示 

 

 

网络编程 --使用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");
            //切换到聊天窗口 加载不删除 
        }

        //加载场景
    }
}
GameMain

 

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[
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[C#学习笔记]类型对象指针和同步.. 下一篇封装计算方法实现面向对象计算器。

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目