一、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、成功~~~~~~~~~~