需要源碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言并且私信~~~
下面利用Unity和C#語(yǔ)言做一個(gè)簡(jiǎn)單的聊天室程序,主要用到的技術(shù)就是Socket通信連接,需要一個(gè)客戶(hù)端和一個(gè)服務(wù)器端,服務(wù)器端就使用C#語(yǔ)言的控制臺(tái)完成
?一、C#語(yǔ)言服務(wù)器端搭建
下面就開(kāi)始搭建C#語(yǔ)言服務(wù)器端
1:新建一個(gè)C#語(yǔ)言控制臺(tái)程序
2:命名項(xiàng)目為Server 右擊項(xiàng)目新建項(xiàng)
3:新建類(lèi)MessageData.cs ClientController.cs MessageData類(lèi)存放指定的消息協(xié)議,每一條消息都由創(chuàng)建消息對(duì)象,設(shè)置消息類(lèi)型和消息內(nèi)容組成,服務(wù)器端和客戶(hù)端都必須配置這個(gè)消息協(xié)議
ClientController腳本用來(lái)控制所有的客戶(hù)端程序
部分代碼如下
using System;
using System.Net.Sockets;
using System.Threading;
namespace Server
{
class ClientController
{
/// <summary>
/// 用戶(hù)鏈接的通道
/// </summary>
private Socket clientSocket;
//接收的線程
Thread receiveThread;
/// <summary>
/// 昵稱(chēng)
/// </summary>
public string nickName;
public ClientController(Socket socket)
{
clientSocket = socket;
//啟動(dòng)接收的方法
//開(kāi)始收的線程
receiveThread = new Thread(ReceiveFromClient);
//啟動(dòng)收的線程
receiveThread.Start();
}
/// <summary>
/// 客戶(hù)端連接 監(jiān)聽(tīng)消息
/// </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("服務(wù)器接收內(nèi)容:{0}", json);
MessageData data = LitJson.JsonMapper.ToObject<MessageData>(json);
switch (data.msgType)
{
case MessageType.Login://登陸
nickName = data.msg;
//1、通知客戶(hù)端登陸成功
MessageData backData = new MessageData();
backData.msgType = MessageType.Login;
backData.msg = "";
SendToClient(backData);
//2、通知所有客戶(hù)端,XXX加入房間
MessageData chatData = new MessageData();
chatData.msgType = MessageType.Chat;
chatData.msg = nickName + " 進(jìn)入了房間";
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、通知客戶(hù)端,退出
MessageData logOutData = new MessageData();
logOutData.msgType = MessageType.LogOut;
SendToClient(logOutData);
//2、通知所有客戶(hù)端,XXX退出了房間
MessageData logOutChatData = new MessageData();
logOutChatData.msgType = MessageType.Chat;
logOutChatData.msg = nickName + " 退出了房間";
SendMessageDataToAllClientWithOutSelf(logOutChatData);
break;
}
}
}
}
/// <summary>
/// 向除了自身客戶(hù)端的其他所有客戶(hù)端廣播消息
/// </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>
/// 發(fā)消息給客戶(hù)端
/// </summary>
/// <param name="data">需要發(fā)送的內(nèi)容</param>
void SendToClient(MessageData data)
{
//把對(duì)象轉(zhuǎn)換為json字符串
string msg = LitJson.JsonMapper.ToJson(data);
//把json字符串轉(zhuǎn)換byte數(shù)組
byte[] msgBytes = System.Text.Encoding.UTF8.GetBytes(msg);
//發(fā)送消息
int sendLength = clientSocket.Send(msgBytes);
Console.WriteLine("服務(wù)器發(fā)送信息成功,發(fā)送信息內(nèi)容:{0},長(zhǎng)度{1}", msg, sendLength);
Thread.Sleep(50);
}
}
}
需要注意的是,這個(gè)腳本引用了一個(gè)LitJson程序包解析JSON數(shù)據(jù),這個(gè)需要右擊程序,選擇管理NuGet程序包選項(xiàng),在彈出的窗口中搜索LitJson然后安裝即可
?
雙擊打開(kāi)Program.cs腳本,這個(gè)腳本是C#語(yǔ)言控制臺(tái)程序的主腳本,腳本中的一個(gè)Main函數(shù)是程序的入口函數(shù) 代碼如下
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
namespace Server
{
class Program
{
/// <summary>
/// 客戶(hù)端管理列表
/// </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和端口號(hào)
IPEndPoint ipendPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 8080);
Console.WriteLine("開(kāi)始綁定端口號(hào)....");
//將ip地址和端口號(hào)綁定
serverSocket.Bind(ipendPoint);
Console.WriteLine("綁定端口號(hào)成功,開(kāi)啟服務(wù)器....");
//開(kāi)啟服務(wù)器
serverSocket.Listen(100);
Console.WriteLine("啟動(dòng)服務(wù)器{0}成功!", serverSocket.LocalEndPoint.ToString());
while (true)
{
Console.WriteLine("等待連接.....");
Socket clinetSocket = serverSocket.Accept();
Console.WriteLine("客戶(hù)端{(lán)0}成功連接", clinetSocket.RemoteEndPoint.ToString());
ClientController controller = new ClientController(clinetSocket);
//添加到列表中
clientControllerList.Add(controller);
Console.WriteLine("當(dāng)前有{0}個(gè)用戶(hù)", clientControllerList.Count);
}
}
}
}
服務(wù)器端目錄結(jié)構(gòu)如下
運(yùn)行服務(wù)器端 啟動(dòng)正常會(huì)彈出一個(gè)窗口
?
?二、Unity客戶(hù)端搭建
Unity客戶(hù)端搭建主要分為以下三個(gè)方面
1:搭建UI界面
2:制定消息協(xié)議
3:編寫(xiě)客戶(hù)端
首先搭建UI界面 UI界面分為三部分,分別是初始界面,登錄界面和聊天界面?
搭建步驟省略 需要可點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言私信 效果如下
在Unity中新建一個(gè)Plugins文件夾 里面存放代碼文件和依賴(lài) 目錄如下
?
整體運(yùn)行效果如下?
運(yùn)行Unity客戶(hù)端 出現(xiàn)兩個(gè)聊天框 可以進(jìn)行實(shí)時(shí)的聊天互動(dòng)?
C#控制臺(tái)服務(wù)器端則會(huì)記錄聊天的信息以及用戶(hù)信息等等?
?
?部分代碼如下文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-755433.html
using UnityEngine;
using UnityEngine.UI;
public class ChatUIController : MonoBehaviour
{
// 昵稱(chēng)
public InputField nickNameInputField;
//顯示消息的文本
public Text text;
// 要發(fā)送的內(nèi)容
public InputField sendMsgInputField;
// socket對(duì)象 代表客戶(hù)端
private ClientSocket clientSocket;
//接收的消息
private string receiveMsg;
// 界面 0==loading 1==登陸 2==聊天
public GameObject[] panels;
//登錄狀態(tài) 0==loading 1==登陸 2==聊天
private int LoadingState;
void Start()
{
clientSocket = this.GetComponent<ClientSocket>();
//委托和具體方法關(guān)聯(lián)
clientSocket.onConnectSuccess += OnSocketConnectSuccess;
clientSocket.receiveMessageData += ReceiveMsgData;
}
void Update()
{
panels[0].SetActive(LoadingState == 0);
panels[1].SetActive(LoadingState == 1);
panels[2].SetActive(LoadingState == 2);
}
/// <summary>
/// 發(fā)送按鈕點(diǎn)擊
/// </summary>
public void SendBtnClick()
{
if (sendMsgInputField != null && sendMsgInputField.text != "")
{
//發(fā)送
clientSocket.PutMessageToQueue(sendMsgInputField.text);
receiveMsg += "我:" + sendMsgInputField.text + "\n";
//清理一下輸入框內(nèi)容
sendMsgInputField.text = "";
}
}
/// <summary>
/// 加入房間按鈕點(diǎn)擊
/// </summary>
public void JoinInBtnClick()
{
if (nickNameInputField != null && nickNameInputField.text != "")
{
//創(chuàng)建數(shù)據(jù)對(duì)象
MessageData data = new MessageData();
data.msgType = MessageType.Login;
data.msg = nickNameInputField.text;
//發(fā)送數(shù)據(jù)對(duì)象
clientSocket.PutMessageToQueue(data);
}
else
{
//提示
Debug.Log("昵稱(chēng)不能為空!");
}
}
/// <summary>
/// 退出房間按鈕點(diǎn)擊事件
/// </summary>
public void LogOutBtnClick()
{
//消息數(shù)據(jù)
MessageData data = new MessageData();
data.msgType = MessageType.LogOut;
//把消息傳進(jìn)去
clientSocket.PutMessageToQueue(data);
}
/// <summary>
/// 連接服務(wù)器成功的回調(diào)
/// </summary>
public void OnSocketConnectSuccess()
{
//進(jìn)入登陸界面
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);
//對(duì)信息進(jìn)行處理
MessageData data = LitJson.JsonMapper.ToObject<MessageData>(msg);
switch (data.msgType)
{
case MessageType.Login://如果是登陸,代表界面可以切換了
receiveMsg = "";
LoadingState = 2;
break;
case MessageType.Chat://如果是聊天,代表進(jìn)行聊天的顯示
receiveMsg += data.msg + "\n";
break;
case MessageType.LogOut://退出消息
receiveMsg = "";
LoadingState = 1;
break;
}
}
}
創(chuàng)作不易 覺(jué)得有幫助請(qǐng)點(diǎn)贊關(guān)注收藏~~~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-755433.html
到了這里,關(guān)于【Unity 3D】利用C#、Unity和Socket實(shí)現(xiàn)簡(jiǎn)單的在線聊天室工具(附源碼 簡(jiǎn)單易懂)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!