简易聊天室app实现:Unity+C# 客户端,Java 服务器端

Unity+C# 客户端

UI界面根据个人喜好排版

                        图1 进入界面                                                        图2 聊天界面

C#脚本代码如下:

Client_dxc.cs

using UnityEngine;
using System.Net.Sockets;
using System.Text;
using System;
using UnityEngine.UI;public class Client_dxc : MonoBehaviour
{public Text GetText;public InputField InputText;public InputField ZhuCeInputText;public Text chatText;public ScrollRect scrollRect;public GameObject DengLuJieMian;private string SetText;private Socket socket;private byte[] buffer = new byte[1024];void Start(){//AddressFamily 寻址类型  SocketType 套接字类型  ProtocolType 协议类型socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//连接服务器socket.Connect("127.0.0.1", 9999);Debug.Log("连接成功!");//开始接收信息readServer();}void Update(){huoqu();}//接收信息void readServer(){//Socket异步接收数据//buffer存储接收到的数据,offset从零开始计数,size要接收的字节数,SocketFlags 值的按位组合//ReceiveCallback一个用户定义的对象,其中包含接收操作的相关信息。当操作完成时,此对象会被传递给EndReceive(IAsyncResult)委托socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, null); }void ReceiveCallback(IAsyncResult iar){int len = socket.EndReceive(iar);if (len == 0){return;}string str = Encoding.UTF8.GetString(buffer, 0, len);SetText = str;//循环接收数据readServer();}//发送信息void sendServer(string msg){//将字符串转换为UTF-8编码的字节数组var outputBuffer = Encoding.UTF8.GetBytes(msg);//将数据异步发送到连接的 Socket//BoutputBuffer包含要发送的数据,SocketFlags 值的按位组合,callback:AsyncCallback 委托,state:Object 包含此请求的状态信息的对象socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);}//获取信息输出到信息面板上public void huoqu(){if (SetText != ""){string addText = "\n  " + SetText;//将获取的信息添加到信息面板中chatText.text += addText;SetText = "";//强制画布更新内容Canvas.ForceUpdateCanvases();//垂直滚动位置,以 0 到 1 之间的值表示,0 表示位于底部scrollRect.verticalNormalizedPosition = 0f;Canvas.ForceUpdateCanvases();}}//绑定“发送”按钮(群发消息)public void qunInput(){if (InputText.text != ""){string msg = "Mass:" + InputText.text + "\r\n";sendServer(msg);InputText.text = "";}}//绑定“进入”按钮(进入群聊注册用户名)public void ZhuCe(){if (ZhuCeInputText.text != ""){string msg = "userName:" + ZhuCeInputText.text + "\r\n";sendServer(msg);DengLuJieMian.SetActive(false);}}}

将脚本挂在Camera上,绑定对应组件及按钮

 

 

 

Java 服务器端

Main.java

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;public class Main {public static void main(String[] args) {try {//创建ServerSocket对象,监听9999端口ServerSocket serversocket = new ServerSocket(9999);System.out.println("----------服务器启动----------");System.out.println("开始监听:");//创建一个循环,使主线程持续监听while (true){//做一个阻塞,监听客户端Socket socket = serversocket.accept();//创建一个新的线程,将客户端socket传入Server server = new Server(socket);//启动线程server.start();}} catch (IOException e) {throw new RuntimeException(e);}}
}

Server.java

import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Server extends Thread{//创建一个Map集合private static Map<String,Socket> map = new ConcurrentHashMap<>();//创建Socket对象private Socket socket;public Server(Socket socket){this.socket = socket;}//重写run方法public void run(){try {//获取客户端的输入流Scanner scanner=new Scanner(socket.getInputStream());String msg=null;//写一个循环来持续处理获取到的信息while (true) {//判断是否接收到了字符串if(scanner.hasNextLine()){//获取信息msg=scanner.nextLine();//处理客户端输入的字符串Pattern pattern=Pattern.compile("\r");Matcher matcher=pattern.matcher(msg);msg=matcher.replaceAll("");//判断字符串是不是以userName:为前缀的if(msg.startsWith("userName:")){//将字符串从:拆分开,后半部分存入userName中String userName=msg.split(":")[1];//注册该用户userEnroll(userName,socket);//将Map集合转换为Set集合Set<Map.Entry<String,Socket>> set=map.entrySet();//遍历集合,向所有用户发送消息for(Map.Entry<String,Socket> entry:set){//取得客户端的Socket对象Socket client=entry.getValue();//取得client客户端的输出流PrintStream printstream=new PrintStream(client.getOutputStream());//向客户端发送信息printstream.println(userName + "加入了群聊!");}continue;}//判断字符串是不是以Mass:为前缀的if(msg.startsWith("Mass:")){//拆分字符串,获取信息内容String str=msg.split(":")[1];//发送群聊信息MassSend(socket,str);}}}} catch (IOException e) {throw new RuntimeException(e);}}//注册用户private void userEnroll(String userName,Socket socket){//将键值对添加入Map集合中map.put(userName,socket);//打印日志System.out.println("[用户名为"+userName+"][客户端为"+socket+"]上线了!");System.out.println("积累进入人数为:"+map.size()+"人");}//发送消息private void MassSend(Socket socket,String msg) {try {//将Map集合转换为Set集合Set<Map.Entry<String, Socket>> set = map.entrySet();String SendName = null;//遍历Set集合找到发起群聊信息的用户for (Map.Entry<String, Socket> entry : set) {//判断集合中的值是否与发起群聊的用户相同if (entry.getValue().equals(socket)) {//获取键名SendName = entry.getKey();break;}}//遍历Set集合将群聊信息发给每一个客户端for (Map.Entry<String, Socket> entry : set) {//取得客户端的Socket对象Socket client = entry.getValue();//取得client客户端的输出流PrintStream printStream = new PrintStream(client.getOutputStream());//发送消息printStream.println(SendName + ":" + msg);}} catch (IOException e) {e.printStackTrace();}}}

应用测试

本次测试为本机测试,模拟多客户端环境

先启动服务器

然后双开Unity,进入两个用户

服务器端界面如下:

 客户端聊天界面如下:

 

测试通过,可正常运行

将Java服务器端代码打包成jar包,发送到服务器上运行即可

将C#代码中的目标ip地址改为服务器ip,Unity客户端打包apk文件,发送到各个手机端安装运行即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/45345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解放生产力的 AI 神器来了

苏生不惑第405 篇原创文章&#xff0c;将本公众号设为星标&#xff0c;第一时间看最新文章。 今天分享几个解放生产力的AI写作神器&#xff0c;首先是腾讯出品的智能写作助手 https://effidit.qq.com/ &#xff0c;文字工作者的福音&#xff0c;提供智能纠错、文本补全、文本改…

医学图像配准论文学习:解剖学约束和注意力引导的深层特征融合,用于关节分割和可变形医学图像配准(2023)

原文链接&#xff1a;Anatomically constrained and attention-guided deep feature fusion for joint segmentation and deformable medical image registration 一、Hilghtlights&#xff1a; 利用分割可以在配准过程中培养先验知识。多任务学习策略提高了配准性能。所提出的…

学习遥感大模型(1)

借着课程作业的机会学习了一些遥感大模型相关的工作&#xff0c;现总结一下 根据非盈利组织忧思科学家联盟&#xff08;The Union of Concerned Scientists&#xff09;&#xff0c;截止2023年1月&#xff0c;全球对地观测卫星在轨数目已超过1000颗。大量的对地观测卫星很大程…

影像组学 - pyradiomics库 - 入门1

目录 一、了解 影像组学 影像组学是什么&#xff08;引用一下chatgpt的解释&#xff09; 影像组学的基本步骤 影像组学的作用与价值 影像组学有哪些特征 二、了解 pyradiomics pyradiomics是什么 pyradiomics使用步骤 pyradiomics的作用与价值 三、正文开始&#xff…

网络安全数据集介绍

目录 1、KDD99 入侵检测数据集 2、NSL KDD 入侵检测数据集 3、UNSW_NB15 入侵检测数据集 4、NASA MDP 软件缺陷数据集 5、CNNVD 软件安全漏洞数据集 6、NVD 软件安全漏洞数据集 1、KDD99 入侵检测数据集 该数据集是从一个模拟的美国空军局域网上采集来的9个星期的网络连…

unsw计算机专业排名,新南威尔士大学UNSW计算机科学Computer Science专业排名第54位(2021年THE世界大学商科排名)...

2021年THE泰晤士高等教育计算机科学Computer Science专业世界大学排名公布,新南威尔士大学UNSW计算机科学世界排名第54位,新南威尔士大学UNSW计算机科学专业实力怎么样呢?下面美英港新留学介绍新南威尔士大学UNSW计算机科学专业培养计划,新南威尔士大学UNSW计算机科学专业研…

[当人工智能遇上安全] 7.基于机器学习的安全数据集总结

您或许知道&#xff0c;作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用&#xff0c;您就有福利了&#xff0c;作者将重新打造一个《当人工智能遇上安全》系列博客&#xff0c;详细介绍人工智能与安全相关的论文、实践&#xff0c;并分享各种案…

找到一个好用的在线创意英文logo设计生成器网站

smashinglogo.com这个在线一键式生成LOGO的网站可以尝试下&#xff0c;输入品牌词和slogan可以无限生成logo。 下面简单举个例子&#xff0c;给大家看一下效果。假设要给Tesla生成一个logo&#xff0c;可以把品牌词写成Tesla&#xff0c;slogan我随便编了一句&#xff1a; jou…

请不要随便走上编程这条路

“互联网的黄金十年已经结束&#xff0c;接下来的十年是白银十年”。这话还是在2016年看到的&#xff0c;当时本人有些沮丧&#xff0c;毕竟还没找到实习的公司。 怎么说呢&#xff0c;在去年&#xff0c;也就是2015年的时候&#xff0c;不敢说别的&#xff0c;大部分互联网专业…

IC工程师简历制作全解读

前言 越来越觉得一份好简历真的很重要! 本文基于下面这个视频记录所得:那个拿35万offer的IC设计应届生简历是这么写的 IC工程师应届生薪资 工艺制造、封测方向——本科/专科:5000-8000元/月,硕士:8000-12000元/月设计方向——本科/专科:6000-1000元/月,硕士:1w5-2w元…

为什么有人说C++是最难学的编程语言? (4个回答)

从事嵌入式开发多年&#xff0c;有三种语言玩的比较多C/C java,从编程语言的难度来讲C是最难得&#xff0c;而且也是最难入门的编程语言&#xff0c;很多编程老手都是这个结论&#xff0c;为什么C是最难学的编程语言&#xff0c;虽然难学但还是很多编程老手喜欢研究它&#xff…

自学编程的人,90%以上都会掉进这些坑,避开这些误区能提高N倍学习效率

前言 几乎每一个程序员都会走上那么一段自学的道路&#xff0c;尤其是在校生或进入工作岗位之后&#xff0c;技术的提升基本都靠自学&#xff0c;有的虽然是网上报班学习&#xff0c;但更多时候还是自己在学习&#xff0c;师傅引进门&#xff0c;修行靠个人。 有的人自学很快…

30岁开始学编程晚吗?

二哥&#xff0c;说出来不怕你笑话&#xff0c;我和你年纪差不多。之前是干别的&#xff0c;但有点编程的基础&#xff0c;最近想转行程序员&#xff0c;不知道晚不晚&#xff0c;你能不能给我一些建议&#xff0c;或者说有没有一些攻略可以参考。 这是上个月一个读者小郑私信我…

机械专业转行IT行业,成功自学Java上岸(分享转行使)

秋招转眼就结束了&#xff0c;将近一年的努力&#xff0c;总算给了自己一个比较满意的结果。写下这篇贴子记录自己的转行以及秋招经历。 其实在转行初期&#xff0c;就无数次幻想着秋招结束&#xff0c;然后写一篇长长的经验贴的那种满足感。下面我尽量把我知道的&#xff0c;…

该如何从教育行业转行做IT——我的真实经历给出的偏门答案

“我需要&#xff0c;最狂的风&#xff0c;和最静的海。”——顾城 本文是对想要入行IT&#xff0c;但是没时间没钱上IT培训班的小伙伴的一些小小的建议&#xff0c;我即将要说的是最近发生在我自己身上的事&#xff0c;这些可以成为“如何转行IT”的一个偏门的答案&#xff0…

编程行业未来趋势如何

随时互联网不断的发展&#xff0c;编程技术不断的优化、成熟&#xff0c;编程行业未来趋势如何一直是热议的话题。 未来数字化&#xff0c;虚拟化&#xff0c;数据化的方向&#xff0c;就是说精神上的追求会成为一大消费趋势&#xff0c;看现在人们使用手机&#xff0c;玩电脑的…

这样学编程,直接原地起飞啊!

大家好&#xff0c;我是二哥呀。 今天来给大家分享一些学习编程的心得&#xff0c;真的颠覆了我以前对学习编程的刻板印象&#xff0c;可以这么说&#xff0c;如果你恰好处在大学阶段&#xff0c;看到了这篇内容&#xff0c;OK&#xff0c;恭喜你&#xff0c;如果你能按照我说…

学好编程的 4 个秘诀

你好呀&#xff0c;我是沉默王二&#xff0c;一枚沉默但有趣又帅气的程序员&#xff08;你听&#xff0c;耳边是不是响起了装逼的声音&#xff09;。今天我来掏心掏肺地聊聊学好编程的 4 个秘诀&#xff0c;应该会对你产生一些微妙而又积极的影响。 闭上眼睛转个圈&#xff0c…

盘点关于程序员的10个有趣的段子

&#xff08;1&#xff09;程序员的读书历程&#xff1a;x 语言入门 —> x 语言应用实践 —> x 语言高阶编程 —> x 语言的科学与艺术 —> 编程之美 —> 编程之道 —> 编程之禅—> 颈椎病康复指南。 &#xff08;2&#xff09;程序员最讨厌的四件事&#…

Unity角色扮演游戏集合

Unity角色扮演游戏集合 Aurora Trail A new epic game where the perspective of the camera changes everything. Do not let your body parts get in the same view as a wall with the same color, or you’ll lose it! Puzzle your way through challenging and appealing…