Unity - Socket通信(多人聊天框)

一、Socket服务器搭建

1、采用C#窗口搭建Socket服务器。

     新建C#项目,项目模板用WPF应用(.NET Framework)

2、设置C#窗口,添加组件,如下图所示

        1)Button1——用来启动服务器

        2)Button2——用来刷新界面

        3)Lable——用来显示接收消息

3、添加类——wangluo.cs 。

        用于 1)创建服务器

                2)启动服务器

                3)接收访问

                4)接收信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server_Chat
{
    //工作端口
    public class WorkPort 
    {
        public Socket work_Port;//工作端
        public int work_Length = 1024;//消息长度
        public byte[] work_Panel=new byte[1024];//消息容器
    }

    public static class wangluo
    {
        public static string serverState;//服务器状态
        //创建服务器
        static Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        //启动服务器
        public static void StartServer()
        {
            //绑定服务器在本地端口
            server.Bind(new IPEndPoint(IPAddress.Any, 10086));
            //监听
            server.Listen(20);
            serverState += "服务器启动成功了\n";
            //尝试接入
            server.BeginAccept(AcceptVisit,server);
        }
        
        //接收访问
        public static void AcceptVisit(IAsyncResult iar)
        {
            Socket m_port = server.EndAccept(iar);
            //获取远端端口
            IPEndPoint m_remotePort = m_port.RemoteEndPoint as IPEndPoint;
            serverState += m_remotePort.Address+"["+m_remotePort.Port.ToString()+"]"+"连接上了\n";
            WorkPort workPort = new WorkPort();//新建工作端口
            workPort.work_Port = m_port;
            m_port.BeginReceive(workPort.work_Panel,0,1024,SocketFlags.None,AcceptMessage,workPort);//开始接收信息
            server.BeginAccept(AcceptVisit, server);//重新监听,形成闭环
        }

        //接收信息
        public static void AcceptMessage(IAsyncResult iar)
        {
            WorkPort workPort = iar.AsyncState as WorkPort;//新建工作端口

            int m_messageLength= workPort.work_Port.EndReceive(iar);//获取消息长度
            MessageProtocol.MessageUnPacking(workPort.work_Panel, workPort.work_Port);//信息协议,拆包
            //serverState += Encoding.UTF8.GetString(workPort.work_Panel,0,m_messageLength);//更新服务器状态
            workPort.work_Port.BeginReceive(workPort.work_Panel, 0, 1024, SocketFlags.None, AcceptMessage, workPort);//重新开始接收信息,形成闭环
        }
    }
}

4、添加信息协议类——MessageProtocol.cs,用于处理信息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

namespace Server_Chat
{
    //信息协议
    public static class MessageProtocol
    {
        //信息打包
        public static byte[] MessagePacking(int messageType, byte[] message)
        {
            byte[] m_messagePanel = new byte[1024];//消息容器
            byte[] m_messageType=BitConverter.GetBytes(messageType);//消息类型
            Buffer.BlockCopy(m_messageType,0, m_messagePanel,0, 4);//存放消息类型 0-4
            byte[] m_messageLength=BitConverter.GetBytes(message.Length);//消息长度
            Buffer.BlockCopy(m_messageLength, 0, m_messagePanel, 4, 4);//存放消息长度 4-8
            Buffer.BlockCopy(message, 0, m_messagePanel, 8, message.Length);//存放消息 8-消息长度
            m_messagePanel= m_messagePanel.Take(4+4+message.Length).ToArray();//拿到需要的信息,除去空格
            return m_messagePanel;
        }
        //信息拆包
        public static void MessageUnPacking(byte[] message,Socket remote) 
        { 
            int m_messageType=BitConverter.ToInt32(message,0);
            int m_messageLength=BitConverter.ToInt32(message,4);
            byte[] m_message=message.Skip(8).ToArray();//跳过前8个,拿到消息
            if(m_messageType==1)
            {
                wangluo.serverState += "接收到玩家心跳\n";
            }
            else if(m_messageType==2)
            {
                wangluo.serverState += "接收到注册信息\n";
            }
            else if(m_messageType==3)
            {
                wangluo.serverState += "接收到登录信息\n";
            }
            else if (m_messageType == 4)
            {
                wangluo.serverState += "接收到聊天信息\n"+Encoding.UTF8.GetString(message);
            }
        }
    }
}

二、Unity客户端搭建

1、搭建Socket类——SocketClass.cs

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using UnityEngine.Accessibility;

public class SocketClass 
{
    //客户端
    public static Socket Client=new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);

    //连接服务器
    public static void Connect2Server()

    {
        Client.Connect("127.0.0.1",10086);
    }
}

2、搭建信息协议类——MessageProtocol.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using UnityEngine;

public static class MessageProtocol 
{
    //信息打包
    public static byte[] MessagePacking(int messageType, byte[] message)
    {
        byte[] m_messagePanel = new byte[1024];//消息容器
        byte[] m_messageType = BitConverter.GetBytes(messageType);//消息类型
        Buffer.BlockCopy(m_messageType, 0, m_messagePanel, 0, 4);//存放消息类型 0-4
        byte[] m_messageLength = BitConverter.GetBytes(message.Length);//消息长度
        Buffer.BlockCopy(m_messageLength, 0, m_messagePanel, 4, 4);//存放消息长度 4-8
        Buffer.BlockCopy(message, 0, m_messagePanel, 8, message.Length);//存放消息 8-消息长度
        m_messagePanel = m_messagePanel.Take(4 + 4 + message.Length).ToArray();//拿到需要的信息,除去空格
        return m_messagePanel;
    }
    //信息拆包
    public static void MessageUnPacking(byte[] message, Socket remote)
    {
        int m_messageType = BitConverter.ToInt32(message, 0);
        int m_messageLength = BitConverter.ToInt32(message, 4);
        byte[] m_message = message.Skip(8).ToArray();//跳过前8个,拿到消息
        if (m_messageType == 1)
        {
         
        }
        else if (m_messageType == 2)
        {
          
        }
        else if (m_messageType == 3)
        {
          
        }
        else if (m_messageType == 4)
        {
       
        }
    }
}

3、创建场景,连接服务器——LoginScene.cs

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

public class LoginScene : MonoBehaviour
{
    public Text txt_state;
    public InputField login_username;
    public InputField login_password;
    public InputField register_username;
    public InputField register_password;
    public InputField input_message;

    //登录方法
    public void Login()
    {
        try {
            //连接服务器
            SocketClass.Connect2Server();
            txt_state.text = "成功连接服务器";
        }
        catch(Exception ex) {
            txt_state.text = "连接服务器失败\n"+ex.Message;
        }
       
    }

    //注册方法
    public void Register()
    {
        
    }

    //发送信息
    public void SendMessage()
    {
        byte[] message = Encoding.UTF8.GetBytes(input_message.text+"\n");
        SocketClass.Client.Send(MessageProtocol.MessagePacking(4, message));//信息打包并发送
        input_message.text = null;
    }
}

三、效果实现

1、启动服务器

2、启动Unity程序 ,点击“登录”连接服务器,点击“刷新按钮”来刷新服务器

 

3、输入信息,点击发送信息,再刷新服务器

 

 

4、成功~~~~~~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逗自己玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值