Unity实现聊天室功能
作者:双鱼-布衣 发布时间:2023-12-20 19:53:34
标签:unity,聊天室
本文实例为大家分享了Unity实现聊天室功能的具体代码,供大家参考,具体内容如下
简单聊天室功能,客户端发送消息后,服务器接收到消息后分发到其它客户端上并显示聊天内容
聊天室服务器
服务器需要有以下几个步骤
1、确定Socket协议类型(采用TCP协议或者UDP协议)
2、绑定服务器的IP地址和端口号
3、设置最大监听数量
4、等到连接并处理消息
由于服务器属于一对多的处理关系,因为我们需要用线程来监听消息:
class Client
{
private Socket clientSocket;
private Thread t;
public bool Connected
{
get
{
return clientSocket.Connected;
}
}
private byte[] data = new byte[1024];//数据容器
public Client(Socket client)
{
clientSocket = client;
//启动一个线程,处理客户端的接受
t = new Thread(ReceiveMsg);
t.Start();
}
private void ReceiveMsg()
{
while (true)
{
//在接收数据之前,判断Socket连接是否断开
if (!clientSocket.Connected)
{
clientSocket.Close();
break;//跳出循环终止线程的执行
}
int length=clientSocket.Receive(data);
string msg = Encoding.UTF8.GetString(data, 0, length);
//服务端接收数据后,要将数据分发到客户端
//广播消息
Program.BroadcastMsg(msg);
}
}
public void SendMsg(string msg)
{
byte[] data = Encoding.UTF8.GetBytes(msg);
clientSocket.Send(data);
}
}
服务器主要代码:
class Program
{
static List<Client> clients = new List<Client>();
//本机IP:192.168.100.172
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.100.172"), 7788));
tcpServer.Listen(5000);
Console.WriteLine("Server Running.......");
while (true)
{
var clientSocket = tcpServer.Accept();
Console.WriteLine("建立连接");
Client client = new Client(clientSocket);
clients.Add(client);
}
}
public static void BroadcastMsg(string msg)
{
var noConnecteds = new List<Client>();
foreach (var client in clients)
{
if (client.Connected)
{
client.SendMsg(msg);
}
else
{
noConnecteds.Add(client);
}
}
foreach (var del in noConnecteds)
{
clients.Remove(del);
}
}
}
Unity客户端代码
Unity客户端代码就十分简单,监听服务器的消息并显示到界面上即可
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine.UI;
using System.Threading;
public class ChatManager : MonoBehaviour
{
public string IP = "192.168.100.172";
public int Port = 7788;
private Socket client;
private Thread t;
public InputField input;
public Button sendBtn;
public Text item;
public string name;
private string msg=string.Empty;
// Start is called before the first frame update
void Start()
{
ConnectedToServer();
sendBtn.onClick.AddListener(() => {
SendMsg(input.text);
input.text = string.Empty;
});
}
// Update is called once per frame
void Update()
{
//由于在Unity中不允许在线程中调用UnityAPI,因此需要的Update中刷新显示
if (!string.IsNullOrEmpty(msg))
{
item.text += "\n" + msg;
msg = string.Empty;
}
}
private void ConnectedToServer()
{
client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(new IPEndPoint(IPAddress.Parse(IP), Port));
//创建一个线程用来接收消息
t = new Thread(ReceiveMsg);
t.Start();
}
byte[] data = new byte[1024];
public void ReceiveMsg()
{
while (true)
{
if (!client.Connected)
{
break;
}
int length = client.Receive(data);
msg = Encoding.UTF8.GetString(data, 0, length);
}
}
public void SendMsg(string msg)
{
byte[] data = Encoding.UTF8.GetBytes(name+":"+msg);
client.Send(data);
}
public void OnDestroy()
{
client.Close();
}
}
实际运行效果(注意需要先启动服务器):
来源:https://blog.csdn.net/qq_19428987/article/details/114278596


猜你喜欢
- 本文实例讲述了Android编程实现调用相册、相机及拍照后直接裁剪的方法。分享给大家供大家参考,具体如下:package com.cvte.
- 我们经常会将数据源放在DataTable里面,但是有时候也需要移除不想要的行,下面的代码告诉你们DataTable dts;DataRow[
- 我们先来看本地如何生成图片验证码的,再来写输出到网页的验证码如何实现。先来看最简单的—实现的功能是,将一个字符串变成图片写入到文件中实现代码
- @pathvariable与@requestparam碰到的一些问题一、@pathvariable可以将 URL 中占位符参数绑定到控制器处
- 如下所示:package com.lcn.day05;import java.util.Scanner;public class Array
- 题目:打印出所有的 "水仙花数 ",所谓 "水仙花数 "是指一个三位数,其各位数字立方和等于该数本身
- 1.数据类型的分类Java的数据类型主要分为两类:基本数据类型、引用数据类型Java中的字符串String属于引用数据类型。因为String
- * 惯,先上图,着急用的朋友,直接带走Demo,先拿来用吧,毕竟老板催的紧,先把工作完成了,再看也来得及,是吧!在项目中这种添加图片上传的效
- 定义:一个对象应该对其他对象了解最少迪米特法则的核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用性才可以提高。形象一点的比喻类似于:
- 引言垃圾收集技术并不是Java语言首创的,1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。垃圾收集技术需要
- 根据UGUI的射线检测机制获取当前鼠标下的UI:/// <summary> /// 获取鼠标停留处UI
- 本文实例为大家分享了OpenCV实现人脸识别程序的具体代码,供大家参考,具体内容如下//Haar特征检测,人脸识别算法,是用xml作为训练后
- 前言TensorFlow是Google开源的一款人工智能学习系统。为什么叫这个名字呢?Tensor的意思是张量,代表N维数组;Flow的意思
- Jenkins 关闭和重启我们用jar -jar jenkins.war来启动jenkins服务器,那么我们如何关闭或者重启jenkins服
- 纯Java代码模拟Hibernate一级缓存原理,简单易懂。import java.util.ArrayList;import java.u
- 手写一个通用加载中、显示数据、加载失败、空数据的LoadingView框架。定义3个布局:加载中,加载失败,空数据加载中:<?xml
- 一.前言在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,
- 1.介绍当系统准备为用户提供一系列相关对象,又不想让用户代码和这些对象形成耦合时,就可以使用抽象工厂模式。2.如何实现1)抽象产品--Car
- 继续练习自定义View。。毕竟熟才能生巧。一直觉得小米的时钟很精美,那这次就搞它~这次除了练习自定义View,还涉及到使用Camera和Ma
- 1. ThreadLocal详解JDK1.2版本起,Java就提供了java.lang.ThreadLocal,ThreadLocal为每个