Unity实现局域网聊天室功能
基于Unity实现一个简单的局域网聊天室,供大家参考,具体内容如下
学习Unity有一点时间了,之前学的都是做客户端的一些内容,现在开始学习联网。我的这个是在观看了 Siki 的教学内容来做的,也有自己的一点点小小的改动在里面。纯粹用于练手了。
【Unity实现局域网聊天室功能】因为本人也是小白一枚,所以,有错误的地方或者更好的实现方法,也希望有大神能帮忙指正,多谢!
整体过程分为两部分:构建服务端、构建客户端。
服务端:
大概思路:
1. 声明Socket连接以及绑定IP和端口,这里面使用
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Net; namespace ServerApplication{class Program{public static string IP; public static int Port; static ListclientList = new List (); static Socket serverSocket; static void Main(string[] args){//绑定IP和端口BindIPAndPort(); //while (true){Socket clientSocket = serverSocket.Accept(); Client client = new Client(clientSocket); clientList.Add(client); Console.WriteLine("一台主机进入连接"); }}/// /// 广播数据/// public static void BroadcostMSG(string s){List NotConnectedList = new List (); foreach (var item in clientList){if(item.IsConnected){item.SendMSG(s); }else{NotConnectedList.Add(item); }}foreach (var item in NotConnectedList){clientList.Remove(item); }}/// /// 绑定IP和端口/// public static void BindIPAndPort(){//创建一个serverSocketserverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //声明IP和端口Console.WriteLine("输入IP地址:"); IP = Console.ReadLine(); string ipStr = IP; Console.WriteLine("请输入端口:"); Port = int.Parse(Console.ReadLine()); int port = Port; IPAddress serverIp = IPAddress.Parse(ipStr); EndPoint serverPoint = new IPEndPoint(serverIp, port); //socket和ip进行绑定serverSocket.Bind(serverPoint); //监听最大数为100serverSocket.Listen(100); }}}
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Sockets; using System.Threading; namespace ServerApplication{class Client{public Socket clientSocket; //声明一个线程用于接收信息Thread t; //接收信息所用容器byte[] data = https://www.it610.com/article/new byte[1024]; //构造函数public Client(Socket s){clientSocket = s; t = new Thread(ReceiveMSG); t.Start(); }/// /// 接收数据/// void ReceiveMSG(){while(true){if (clientSocket.Poll(10,SelectMode.SelectRead)){break; }data = new byte[1024]; int length = clientSocket.Receive(data); string message = Encoding.UTF8.GetString(data, 0, length); Program.BroadcostMSG(message); Console.WriteLine("收到消息:" + message); }}/// /// 发送数据/// /// public void SendMSG(string message){byte[] data = https://www.it610.com/article/Encoding.UTF8.GetBytes(message); clientSocket.Send(data); }//判断此Client对象是否在连接状态public bool IsConnected{get { return clientSocket.Connected; }}}}
客户端: a.UI界面
UI界面是使用UGUI实现的
登录用户可以自己取名进行登录(发言时用于显示),使用时需要输入服务端的IP地址和端口号
文章图片
下面是聊天室的页面,在输入框内输入要发送的消息,点击Send,将信息发送出去
文章图片
这是服务端的信息
文章图片
b.关于客户端的脚本
(1)这是ClientManager,负责与服务端进行连接,通信
using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Net.Sockets; using System.Net; using System.Text; using UnityEngine.UI; using System.Threading; public class ClientManager : MonoBehaviour{//ip:192.168.1.7public string ipAddressstr; public int port; public Text ipTextToShow; //Socketprivate Socket ClientServer; //文本输入框public InputField inputTxt; public string inputMSGStr; //接收Thread t; public Text receiveTextCom; public string message; // Use this for initializationvoid Start(){ipTextToShow.text = ipAddressstr; // ConnectedToServer(); }// Update is called once per framevoid Update(){if (message != null && message != ""){receiveTextCom.text = receiveTextCom.text + "\n" + message; message = ""; }}/// /// 连接服务器/// public void ConnectedToServer(){ClientServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //声明IP地址和端口IPAddress ServerAddress = IPAddress.Parse(ipAddressstr); EndPoint ServerPoint = new IPEndPoint(ServerAddress, port); ipAddressstr = IpInfo.ipStr; port = IpInfo.portStr; //开始连接ClientServer.Connect(ServerPoint); t = new Thread(ReceiveMSG); t.Start(); }/// /// 接收消息/// ///“string” void ReceiveMSG(){while (true){if (ClientServer.Connected == false){break; }byte[] data = https://www.it610.com/article/new byte[1024]; int length = ClientServer.Receive(data); message = Encoding.UTF8.GetString(data, 0, length); //Debug.Log("有消息进来"); }}/// /// 发送string类型数据/// /// public void SendMSG(){Debug.Log("button Clicked"); //message = "我:" + inputTxt.text; inputMSGStr = inputTxt.text; byte[] data = https://www.it610.com/article/Encoding.UTF8.GetBytes(IpInfo.name+":"+inputMSGStr); ClientServer.Send(data); }private void OnDestroy(){ClientServer.Shutdown(SocketShutdown.Both); ClientServer.Close(); }private void OnApplicationQuit(){OnDestroy(); }}
(2)SceneManager,用于场景切换,这里只是利用GameObject进行SetActive()来实现,并不是创建了单独的Scene进行管理。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SceneManager : MonoBehaviour {public GameObject loginPanel; public GameObject communicatingPanel; // Use this for initializationpublic void OnSwitch(){loginPanel.SetActive(false); communicatingPanel.SetActive(true); }}
(3)LogInPanel和IPInfo,一个挂载在登录界面上,一个是数据模型,用于存储数据。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class LogInPanel : MonoBehaviour {public Text nameInputTxt; public Text ipInputTxt; public Text portInputTxt; //private string name; //private string ipStr; //private string portStr; public void OnLogInClick(){IpInfo.name = nameInputTxt.text; IpInfo.ipStr = ipInputTxt.text; IpInfo.portStr = int.Parse(portInputTxt.text); }}
public static class IpInfo {public static string name; public static string ipStr; public static int portStr; }
总结:第一次写学习博,还有很多地方要学习啊。
留待解决的问题:此聊天室只能用于局域网以内,广域网就无法实现通信了,还要看看怎么实现远程的一个通信,不然这个就没有存在的意义了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- 人脸识别|【人脸识别系列】| 实现自动化妆
- paddle|动手从头实现LSTM
- pytorch|使用pytorch从头实现多层LSTM