unity使用socket实现聊天室功能
作者:ai上白菜 发布时间:2021-08-12 01:57:59
标签:unity,socket,聊天室
本文实例为大家分享了unity使用socket实现聊天室的具体代码,供大家参考,具体内容如下
unity聊天室服务端实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Net;
namespace 服务端_03
{
class Program
{
static string ip = "192.168.0.102";
static int port = 7788;
static List<Client> clientLists = new List<Client>();
public static void BrocastMessage(string s)
{
var notConnectLists = new List<Client>();
foreach (var client in clientLists)
{
if(client.Connected)
{
client.SendMessage(s);
}
else
{
notConnectLists.Add(client);
}
}
foreach (var client in notConnectLists)
{
clientLists.Remove(client);
}
}
static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iPEnd = new IPEndPoint(IPAddress.Parse(ip), port);
tcpServer.Bind(iPEnd);
tcpServer.Listen(100);
Console.WriteLine("服务器已开启...");
while (true)
{
Socket clientSocket = tcpServer.Accept();
Client client = new Client(clientSocket);
//client.ReceiveMessage();
clientLists.Add(client);
}
}
}
}
服务端Client类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net.Sockets;
using System.Threading;
namespace 服务端_03
{
class Client
{
Socket clientSocket;
byte[] data = new byte[1024];
Thread t;
public Client(Socket clientSocket)
{
this.clientSocket = clientSocket;
t = new Thread(ReceiveMessage);
t.Start();
}
public void SendMessage(string s)
{
byte[] data = Encoding.UTF8.GetBytes(s);
clientSocket.Send(data);
}
public void ReceiveMessage()
{
while (true)
{
if(clientSocket.Poll(10,SelectMode.SelectRead))
{
clientSocket.Close();
break;
}
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);
//dosomething 向所有的客户端广播消息
Program.BrocastMessage(message);
Console.WriteLine(message); ;
}
}
public bool Connected
{
get { return clientSocket.Connected; }
}
}
}
unity客户端实现
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class ChatClient : MonoBehaviour
{
public string ipaddress = "172.25.14.165";
public int port = 7799;
private Socket clientSocket;
public InputField MessageInput;
public Text MessageText;
private Thread thread;
private byte[] data = new byte[1024];// 数据容器
private string message = "";
void Start()
{
ConnectToServer();
}
void Update()
{
//只有在主线程才能更新UI
if (message != "" && message != null)
{
MessageText.text += "\n" + message;
message = "";
}
}
/**
* 连接服务器端函数
* */
void ConnectToServer()
{
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//跟服务器连接
clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port));
//客户端开启线程接收数据
thread = new Thread(ReceiveMessage);
thread.Start();
}
void ReceiveMessage()
{
while (true)
{
if (clientSocket.Connected == false)
{
break;
}
int length = clientSocket.Receive(data);
message = Encoding.UTF8.GetString(data, 0, length);
print(message);
}
}
new void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
public void OnSendButtonClick()
{
string value = MessageInput.text;
SendMessage(value);
MessageInput.text = " ";
}
/**
* unity自带方法
* 停止运行时会执行
* */
void OnDestroy()
{
//关闭连接,分接收功能和发送功能,both为两者均关闭
clientSocket.Shutdown(SocketShutdown.Both);
clientSocket.Close();
}
}
来源:https://blog.csdn.net/qq_36559726/article/details/79421520


猜你喜欢
- 获取最新插入数据的id原始方法读取最后一条的插入数据,但这样会造成如果两条数据同时插入,会并发出现错误SELECT * FROM admin
- 本文实例讲述了C#中的事务用法。分享给大家供大家参考。具体如下:直接用SQL语句创建事务, 当然不是什么稀奇事了, 好是好, 只是麻烦.看看
- 前言介绍了几篇 Hero 动画,我们来一个 Hero 动画应用案例。在一些应用中,列表的元素和详情的
- 本文实例为大家分享了Android seekbar实现可拖动进度条的具体代码,供大家参考,具体内容如下SeekBar通过滑块的位置来标识数值
- 我们有时用C#需要实现锁住文件的功能,该如何锁住文件呢?下面小编给大家介绍一下。首先大家需要到码云里面找到如下图所示的文件锁的项目,如下图所
- 本文实例为大家分享了java实现登录窗口的具体代码,供大家参考,具体内容如下登录窗口主类package ccnu.paint;import
- 项目中经常遇到分数统计的需求,例如我们执行了某项操作或做了某个题目,操作正确则计分,相反则不计分失去该项分数,为了应对需求需要一个分数统计系
- 水仙花数:水仙花数是三位数,它的各位数字的立方和等于这个三位数本身,例如:370=33+73+00;371=33+73+13,370、371
- 本文实例讲述了Java设计模式之抽象工厂模式。分享给大家供大家参考,具体如下:具体工厂类:生产创建某一类具体产品对象。抽象产品类可以使用接口
- 前言:学习过我的mall项目的应该知道,mall-admin模块是使用SpringSecurity+JWT来实现登录认证的,而mall-po
- 因为在准备讲Maven用Maven Helper插件的时候,在网上学习,发现资料很少,我就把自己研究的配置分享给大家!!IDEA(本人用的2
- 一、前言 高斯混合模型(Gaussian Mixture Model)简称GMM,是一种业界广泛使用的聚类算法。它是多个高斯分布函
- 一、简介前面介绍了平时用到的大多数的多线程的例子,但在实际开发中使用的线程往往是大量的和更为复杂的,这时,每次都创建线程、启动线程。从性能上
- 如果使用IDEA创建Springboot项目,默认会在resource目录下创建application.properties文件,在spri
- 前言自从国产之光fastjson频频暴雷,jackson json的使用是越来越广泛了。尤其是spring家族把它搞成了默认的JSON处理包
- Spring security记住我基本原理:登录的时候,请求发送给过滤器UsernamePasswordAuthenticationFil
- 大部分的 Java 软件开发都会使用到各种不同的库。近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些
- 现在已经进入了2018年,Android 8.0系统也逐渐开始普及起来了。三星今年推出的最新旗舰机Galaxy S9已经搭载了Android
- 最近要做一个java web项目,因为页面不是很多,所以就没有前后端分离,前后端写在一起,这时候就用到thymeleaf了,以下是不动脑式的
- 本文实例讲述了C#自定义RSA加密解密及RSA签名和验证类。分享给大家供大家参考。具体分析如下:这个C#类自定义RSA加密解密及RSA签名和