热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UDP实现一个简易的聊天室(Unity&&C#完成)

效果展示(尚未完善)chatudpclienttestusingsystem.collections;usingsystem.collections.generic;using

  效果展示(尚未完善)


chatudpclienttest

using system.collections;
using system.collections.generic;
using unityengine;
using system.threading;
using system.net;
using system.net.sockets;
using system.text;
using common;
using uiwidgetssamples;
using system;
///


/// 服务端
///

public class chatudpservertest : monobehaviour
{
public string serverip;
//ip地址
public int serverport;
//端口
//1.创建scoket对象 ip port
private thread thread;
private udpclient udpseivic;
public void start()
{
chatview = transform.findchildbyname("chatview").
getcomponent();
//给端口和ip
//构建终结点 ip和一个端口
ipendpoint localep = new
ipendpoint(ipaddress.parse(serverip), serverport);
udpseivic = new udpclient(localep);
thread = new thread(receivemessage);
thread.start();
}

///
/// 接收消息
///

private void receivemessage()
{
while (true)
{
ipendpoint remote = new
ipendpoint(ipaddress.any, 0);
//创建任意终结点
//ref
byte[] date = udpseivic.receive(ref remote);
//receive接收消息 如果没有收到消息 线程阻塞 放在线程中
string msg = encoding.utf8.getstring(date);
//获取的客户都安信息
debug.log(remote.address + "===" + remote.port);
//如果接收客户端的消息,会把任意终结点修改为客户端的终结点
threadcrosshelper.instance.executeonmainthread(() => { showmessage(msg); });
}
}
private chatview chatview;
///
/// 显示消息
///

///


public void showmessage(string msg)
{
chatview.datasource.add(new chatline()
{
username = "annns",
message = msg,
time = datetime.now,
type = chatlinetype.user,
});
}
private void onapplicationquit()
{
udpseivic.close();
thread.abort();
}
}

chatudpservertest

脚本引用的工具箱



  1. monosingleton (泛型单例)

  2. threadcrosshelper (为子线程提供,可以在主线程中执行的方法)

  3. transformhelper(根据名称查找后代元素)

using system.collections;
using system.collections.generic;
using unityengine;
namespace common
{
///


///
///

public class monosingleton : monobehaviour where t : monosingleton
{
//public static t instance
//{
// get;
// private set;
//}
//private void awake()
//{
// instance = this as t;
//}
//按需加载
private static t instance;
public static t instance
{
get
{
if (instance == null)
{
//在场景中查找对象
instance = findobjectoftype();
if (instance == null)
{
//创建游戏对象 附加 脚本对象
new gameobject("singleton of " + typeof(t)).addcomponent();//立即执行awake
}
else
{
instance.initialized();
}
}
return instance;
}
}
protected virtual void initialized()
{
}
[tooltip("是否需要跨场景不销毁")]
public bool isdOntdestroy= true;
//如果管理类自行附加到物体中
//在awake中为instance赋值
protected void awake()
{
if (isdontdestroy)
{
dontdestroyonload(gameobject);
}
if (instance == null)
{
instance = this as t;
instance.initialized();
}
}
}
}

monosingleton

using system;
using system.collections;
using system.collections.generic;
using unityengine;

namespace common
{
///


///
///

public class threadcrosshelper : monosingleton
{
///
/// 延迟项
///

class delayeditem
{
public action currentaction { get; set; }
public datetime time { get; set; }
}
private list actionlist;
//private list actionlist;
//private list timelist;
protected override void initialized()
{
base.initialized();
actiOnlist= new list();
}
private void update()
{
for (int i = actionlist.count - 1; i >= 0; i--)
{
//到时间
if (actionlist[i].time <= datetime.now)
{
lock (actionlist)
{
actionlist[i].currentaction();//执行
actionlist.removeat(i);//从列表中移除
}
}
}
}
///
/// 为子线程提供,可以在主线程中执行的方法
///

///


///


public void executeonmainthread(action action, float dealy = 0)
{
delayeditem item = new delayeditem()
{
currentaction = action,
//time = time.time + dealy
time = datetime.now.addseconds(dealy)
};
lock (actionlist)
{
actionlist.add(item);
}
}
}
}

threadcrosshelper

using system.collections;
using system.collections.generic;
using unityengine;
namespace common
{
///


/// 变换组件助手类
///

public static class transformhelper
{
///
/// 未知层级,根据名称查找后代元素
///

///


///


///
public static transform findchildbyname(this transform currenttf, string childname)
{
transform childtf = currenttf.find(childname);
if (childtf != null) return childtf;
//将问题推迟给子物体
for (int i = 0; i {
//在方法体内部,又遇到了相同的问题,所以需要调用自身。
childtf = findchildbyname(currenttf.getchild(i), childname);
if (childtf != null) return childtf;
}
return null;
}
}
}

transformhelper



推荐阅读
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 使用jqTransform插件美化表单
    jqTransform 是由 DFC Engineering 开发的一款 jQuery 插件,专用于美化表单元素,操作简便,能够美化包括输入框、单选按钮、多行文本域、下拉选择框和复选框在内的所有表单元素。 ... [详细]
  • 本文将详细介绍如何在Webpack项目中安装和使用ECharts,包括全量引入和按需引入的方法,并提供一个柱状图的示例。 ... [详细]
  • 使用Jsoup解析并遍历HTML文档时,该库能够高效地生成一个清晰、规范的解析树,即使源HTML文档存在格式问题。Jsoup具备强大的容错能力,能够处理多种异常情况,如未闭合的标签等,确保解析结果的准确性和完整性。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 本文详细解析了客户端与服务器之间的交互过程,重点介绍了Socket通信机制。IP地址由32位的4个8位二进制数组成,分为网络地址和主机地址两部分。通过使用 `ipconfig /all` 命令,用户可以查看详细的IP配置信息。此外,文章还介绍了如何使用 `ping` 命令测试网络连通性,例如 `ping 127.0.0.1` 可以检测本机网络是否正常。这些技术细节对于理解网络通信的基本原理具有重要意义。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • 本文深入探讨了MDK链接脚本的应用与优化技巧。首先,文章介绍了链接脚本的基本概念及其在嵌入式系统开发中的重要性。接着,通过具体实例详细分析了链接脚本的结构和功能,特别是在程序在FLASH中运行时,如何优化链接脚本以提高系统性能。此外,文章还讨论了无需将程序加载到SRAM中的技术细节,为开发者提供了实用的参考和指导。 ... [详细]
author-avatar
VW旻shi只吃货8453
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有