需要源码请点赞关注收藏后评论区留言并且私信~~~
下面利用Unity和C#语言做一个简单的聊天室程序,主要用到的技术就是Socket通信连接,需要一个客户端和一个服务器端,服务器端就使用C#语言的控制台完成
一、C#语言服务器端搭建
下面就开始搭建C#语言服务器端
1:新建一个C#语言控制台程序
2:命名项目为Server 右击项目新建项
3:新建类MessageData.cs ClientController.cs MessageData类存放指定的消息协议,每一条消息都由创建消息对象,设置消息类型和消息内容组成,服务器端和客户端都必须配置这个消息协议
ClientController脚本用来控制所有的客户端程序
部分代码如下
using System;
using System.Net.Sockets;
using System.Threading;
namespace Server
{
class ClientController
{
/// <summary>
/// 用户链接的通道
/// </summary>
private Socket clientSocket;
//接收的线程
Thread receiveThread;
/// <summary>
/// 昵称
/// </summary>
public string nickName;
public ClientController(Socket socket)
{
clientSocket = socket;
//启动接收的方法
//开始收的线程
receiveThread = new Thread(ReceiveFromClient);
//启动收的线程
receiveThread.Start();
}
/// <summary>
/// 客户端连接 监听消息
/// </summary>
void ReceiveFromClient()
{
while (true)
{
byte[] buffer = new byte[512];
int lenght = clientSocket.Receive(buffer, 0, buffer.Length, SocketFlags.None);
string json = System.Text.Encoding.UTF8.GetString(buffer, 0, lenght);
json.TrimEnd();
if (json.Length > 0)
{
Console.WriteLine("服务器接收内容:{0}", json);
MessageData data = LitJson.JsonMapper.ToObject<MessageData>(json);
switch (data.msgType)
{
case MessageType.Login://登陆
nickName = data.msg;
//1、通知客户端登陆成功
MessageData backData = new MessageData();
backData.msgType = MessageType.Login;
backData.msg = "";
SendToClient(backData);
//2、通知所有客户端,XXX加入房间
MessageData chatData = new MessageData();
chatData.msgType = MessageType.Chat;
chatData.msg = nickName + " 进入了房间";
SendMessageDataToAllClientWithOutSelf(chatData);
break;
case MessageType.Chat://聊天
MessageData chatMessageData = new MessageData();
chatMessageData.msgType = MessageType.Chat;
chatMessageData.msg = nickName + ":" + data.msg;
SendMessageDataToAllClientWithOutSelf(chatMessageData);
break;
case MessageType.LogOut://退出
//1、通知客户端,退出
MessageData logOutData = new MessageData();
logOutData.msgType = MessageType.LogOut;
SendToClient(logOutData);
//2、通知所有客户端,XXX退出了房间
MessageData logOutChatData = new MessageData();
logOutChatData.msgType = MessageType.Chat;
logOutChatData.msg = nickName + " 退出了房间";
SendMessageDataToAllClientWithOutSelf(logOutChatData);
break;
}
}
}
}
/// <summary>
/// 向除了自身客户端的其他所有客户端广播消息
/// </summary>
/// <param name="data"></param>
void SendMessageDataToAllClientWithOutSelf(MessageData data)
{
for (int i = 0; i < Program.clientControllerList.Count; i++)
{
if (Program.clientControllerList[i] != this)
{
Program.clientControllerList[i].SendToClient(data);
}
}
}
/// <summary>
/// 发消息给客户端
/// </summary>
/// <param name="data">需要发送的内容</param>
void SendToClient(MessageData data)
{
//把对象转换为json字符串
string msg = LitJson.JsonMapper.ToJson(data);
//把json字符串转换byte数组
byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
//发送消息
int sendLength = clientSocket.Send(msgBytes);
Console.WriteLine("服务器发送信息成功,发送信息内容:{0},长度{1}", msg, sendLength);
Thread.Sleep(50);
}
}
}
需要注意的是,这个脚本引用了一个LitJson程序包解析JSON数据,这个需要右击程序,选择管理NuGet程序包选项,在弹出的窗口中搜索LitJson然后安装即可
双击打开Program.cs脚本,这个脚本是C#语言控制台程序的主脚本,脚本中的一个Main函数是程序的入口函数 代码如下
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
namespace Server
{
class Program
{
/// <summary>
/// 客户端管理列表
/// </summary>
public static List<ClientController> clientControllerList = new List<ClientController>();
static void Main(string[] args)
{
//定义socket
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//绑定IP和端口号
IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
Console.WriteLine("开始绑定端口号....");
//将ip地址和端口号绑定
serverSocket.Bind(ipendPoint);
Console.WriteLine("绑定端口号成功,开启服务器....");
//开启服务器
serverSocket.Listen(100);
Console.WriteLine("启动服务器{0}成功!", serverSocket.LocalEndPoint.ToString());
while (true)
{
Console.WriteLine("等待连接.....");
Socket clinetSocket = serverSocket.Accept();
Console.WriteLine("客户端{0}成功连接", clinetSocket.RemoteEndPoint.ToString());
ClientController controller = new ClientController(clinetSocket);
//添加到列表中
clientControllerList.Add(controller);
Console.WriteLine("当前有{0}个用户", clientControllerList.Count);
}
}
}
}
服务器端目录结构如下
运行服务器端 启动正常会弹出一个窗口
二、Unity客户端搭建
Unity客户端搭建主要分为以下三个方面
1:搭建UI界面
2:制定消息协议
3:编写客户端
首先搭建UI界面 UI界面分为三部分,分别是初始界面,登录界面和聊天界面
搭建步骤省略 需要可点赞关注收藏后评论区留言私信 效果如下
在Unity中新建一个Plugins文件夹 里面存放代码文件和依赖 目录如下
整体运行效果如下
运行Unity客户端 出现两个聊天框 可以进行实时的聊天互动
C#控制台服务器端则会记录聊天的信息以及用户信息等等
部分代码如下文章来源:https://www.toymoban.com/news/detail-755433.html
using UnityEngine;
using UnityEngine.UI;
public class ChatUIController : MonoBehaviour
{
// 昵称
public InputField nickNameInputField;
//显示消息的文本
public Text text;
// 要发送的内容
public InputField sendMsgInputField;
// socket对象 代表客户端
private ClientSocket clientSocket;
//接收的消息
private string receiveMsg;
// 界面 0==loading 1==登陆 2==聊天
public GameObject[] panels;
//登录状态 0==loading 1==登陆 2==聊天
private int LoadingState;
void Start()
{
clientSocket = this.GetComponent<ClientSocket>();
//委托和具体方法关联
clientSocket.onConnectSuccess += OnSocketConnectSuccess;
clientSocket.receiveMessageData += ReceiveMsgData;
}
void Update()
{
panels[0].SetActive(LoadingState == 0);
panels[1].SetActive(LoadingState == 1);
panels[2].SetActive(LoadingState == 2);
}
/// <summary>
/// 发送按钮点击
/// </summary>
public void SendBtnClick()
{
if (sendMsgInputField != null && sendMsgInputField.text != "")
{
//发送
clientSocket.PutMessageToQueue(sendMsgInputField.text);
receiveMsg += "我:" + sendMsgInputField.text + "\n";
//清理一下输入框内容
sendMsgInputField.text = "";
}
}
/// <summary>
/// 加入房间按钮点击
/// </summary>
public void JoinInBtnClick()
{
if (nickNameInputField != null && nickNameInputField.text != "")
{
//创建数据对象
MessageData data = new MessageData();
data.msgType = MessageType.Login;
data.msg = nickNameInputField.text;
//发送数据对象
clientSocket.PutMessageToQueue(data);
}
else
{
//提示
Debug.Log("昵称不能为空!");
}
}
/// <summary>
/// 退出房间按钮点击事件
/// </summary>
public void LogOutBtnClick()
{
//消息数据
MessageData data = new MessageData();
data.msgType = MessageType.LogOut;
//把消息传进去
clientSocket.PutMessageToQueue(data);
}
/// <summary>
/// 连接服务器成功的回调
/// </summary>
public void OnSocketConnectSuccess()
{
//进入登陆界面
LoadingState = 1;
}
/// <summary>
/// 接收消息的方法
/// </summary>
/// <param name="byteArray"></param>
/// <param name="offset"></param>
/// <param name="length"></param>
public void ReceiveMsgData(byte[] byteArray, int offset, int length)
{
string msg = ClientSocket.ByteArrayToString(byteArray, offset, length);
Debug.Log("收到信息:" + msg);
//对信息进行处理
MessageData data = LitJson.JsonMapper.ToObject<MessageData>(msg);
switch (data.msgType)
{
case MessageType.Login://如果是登陆,代表界面可以切换了
receiveMsg = "";
LoadingState = 2;
break;
case MessageType.Chat://如果是聊天,代表进行聊天的显示
receiveMsg += data.msg + "\n";
break;
case MessageType.LogOut://退出消息
receiveMsg = "";
LoadingState = 1;
break;
}
}
}
创作不易 觉得有帮助请点赞关注收藏~~~文章来源地址https://www.toymoban.com/news/detail-755433.html
到了这里,关于【Unity 3D】利用C#、Unity和Socket实现简单的在线聊天室工具(附源码 简单易懂)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!