设为首页 加入收藏

TOP

UDP实现一个简易的聊天室(多个主机连接终端) 已完善(二)
2019-09-17 18:13:31 】 浏览:54
Tags:UDP 实现 一个 简易 聊天室 多个 主机 连接 终端 完善
] result = ms.ToArray();
//从内存流中获取字节数组 return ms.ToArray(); } } public static ChatMessage BytesToObject(byte [] bytes) { using (MemoryStream ms = new MemoryStream(bytes)) { //内存流 BinaryFormatter fomatter = new BinaryFormatter(); //二进制格式化器 return fomatter.Deserialize(ms) as ChatMessage; //反序列化 将内存流中 中的字节反序列化 } //自动释放资源 } } } ChatMessage
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Net;

namespace  NS
{
    ///<summary>
    /// 事件参数类 
    ///</summary>
    public class MessageArrivedEventArgs
    {
        public  ChatMessage Message { get; set; }
        public DateTime DateTime { get; set; }

        public IPEndPoint senderEP { get; set; }

    }
}
MessageArrivedEventArgs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace  NS
{
    ///<summary>
    /// 消息类型
    ///</summary>
    public enum UDPNetWork
    {
        Online,
        //上线
        Offline,
        //下线
        General
        //普通
    }
}
UDPNetWork

 

NetWork Service(网络服务)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
using Common;
using System.Net.Sockets;
using System.Text;
using UnityEngine.UI;
using System.Net;
using UIWidgetsSamples;
using System.Threading;
namespace  NS
{
    ///<summary>
    ///基于UDP协议  客户端网络服务类
    ///</summary>
    public class UDPClientNetWorkService : MonoSingleton<UDPClientNetWorkService>
    {
        //事件参数类  传递信息
        public event Action<MessageArrivedEventArgs> MessageArrivedEventHandler;
        //初始化socket对象  ,由开始界面的Game Main类调用
        private Thread receiverThread;
        //线程
        private UdpClient udpServer;
        public void Initialized(string serverIP)
        {
            
            //加载不删除对象
            udpServer = new UdpClient();
            //客户端发送消息再给终结点
            serverEP = new IPEndPoint(IPAddress.Parse(serverIP), 8989);
            Debug.Log(serverEP.Address);

            //分配IP和端口  没有保存
            udpServer.Connect(serverEP);
            //Connect方法建立默认远程主机使用中指定的值endPoint参数。 
            //一旦建立,无需在每次调用中指定远程主机Send方法。

            receiverThread = new Thread(ReceiveMessage);
            receiverThread.Start();
            //提示上线
            SendChatMessage(new ChatMessage() { Type = UDPNetWork.Online });
        }
        private IPEndPoint serverEP;
        //发送消息  send按钮
        public void SendChatMessage(ChatMessage msg)
        {
            byte[] dgram = msg.ObjectToBytes();
            //获取报文
            udpServer.Send(dgram, dgram.Length);
            //发送需要端口和IP
            
            Debug.Log(msg.Type);
        }
        //接收消息  接收阻塞  线程
        public void ReceiveMessage()
        {
            while (true)//不停接收数据
            {
                //接收
                IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
                byte[] date = udpServer.Receive(ref remote);
                ChatMessage msg = ChatMessage.BytesToObject(date);
                Debug.Log(msg.Type);
                //引发事件
                if (MessageArrivedEventHandler != null)
                {
                    //线程交叉助手类调用 因为访问UnityAPI
                    ThreadCrossHelper.Instance.ExecuteOnMainThread(() =>
                    {
                        var args = new MessageArrivedEventArgs()
                        {
                            Message = msg,
                            DateTime = DateTime.Now
                        };
                    //创建事件参数类  参数没有赋值???
                    MessageArrivedEventHandler(args);
                    //调用方法不需要传参数吗???
                });
                }

            }
        }
        //关闭
        public void OnApplicationQuit()
        {
            SendChatMessage(new ChatMessage() { Type = UDPNetWork.Offline });
            receiverThread.Abort();
            udpServer.Close();
        }
    }
}
UDPClientNetWorkService
using System.Collections;
using System.Collections.Generic;
using U
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[C#学习笔记]类型对象指针和同步.. 下一篇封装计算方法实现面向对象计算器。

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目