首页 > 其他分享 >Unity制作聊天室功能

Unity制作聊天室功能

时间:2023-01-05 13:37:56浏览次数:41  
标签:聊天室 void System Unity new using 制作 public 客户端


用untiy作客户端、用VS的控制台程序来做服务器。

首先是服务器端的代码,分两个类一个Program,一个ForClient类。分别如下:

using System.Net.Sockets;
using System.Collections.Generic;
using System.Net;
using System;
namespace serverforchaizhuang
{
class Program
{
static List<ForClient> clientlist = new List<ForClient>();
static void Main(string[] args)
{

Socket TcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
TcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.239.1"), 7788));
TcpServer.Listen(100);
Console.WriteLine("服务器开启");

while (true)
{
Socket clientSocket = TcpServer.Accept();
Console.WriteLine("新接入一个客户端");
ForClient cc = new ForClient(clientSocket);//每个客户端通信逻辑放到client
clientlist.Add(cc);
}

}

public static void BroadcastMessage(string message)
{
var notConnectedList = new List<ForClient>();

foreach (var clients in clientlist)
{
if (clients.Connected)
clients.SendMessage(message);
else
{
notConnectedList.Add(clients);
}
}
foreach (var temp in notConnectedList)
{
clientlist.Remove(temp);
}
}
}
}

ForClient类如下:

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading;

namespace serverforchaizhuang
{

class ForClient
{

private byte[] data = new byte[1024];//这个是一个数据容器
private Socket socketclient;
private Thread tt;

public ForClient(Socket s)
{
socketclient = s;
//启动一个线程,处理客户端数据接收

tt = new Thread(ReceiveMessage);
tt.Start();
}

void ReceiveMessage()
{
//一直接收客户端的数据
while (true)
{
//在接收数据之前 判断一下socket连接是否断开
if (socketclient.Poll(10, SelectMode.SelectRead))
{
socketclient.Close();
break;//跳出循环 终止线程的执行
}
else {

try
{
int length = socketclient.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);

//接收到数据的时候 要把这个数据 分发到客户端
//广播这个消息
Program.BroadcastMessage(socketclient.RemoteEndPoint +message);
Console.WriteLine("收到了客户端:" + socketclient.RemoteEndPoint + "消息:" + message);
}

catch {
Console.WriteLine("出错了");
}
}
}
}

public void SendMessage(string message)
{

byte[] data = Encoding.UTF8.GetBytes(message);
socketclient.Send(data);
}
public bool Connected
{
get { return socketclient.Connected; }
}
}
}

解释一下:Program类用来负责服务器的创建以及进行广播消息的。而ForClient类则是负责处理和客户端的消息数据的。Program中一直在监听是否有新的客户端进来,每新来一个客户端都会被存储到list集合里,同时会在ForClient类中为这个客户端开启一个新的线程,然后在这个线程里进行服务器和客户端的通讯消息处理。

--------------------------------------------------------------------------------

接下来是客户端的开发

客户端用unity的UGUI制作一个输入框、按钮和文本显示框。实现:输入文字点击发送按钮可以发出消息,同时在文本框上可以看到自己的发出的和别人发来的消息。原理就是客户端发送消息给服务器,然后服务器又广播到了所有的客户端,所以每一个客户端(包括发送该消息的客户端)都可以看到发送的文字。

Unity制作聊天室功能_服务器

接下来是客户端的代码:

using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using System.Text;
using UnityEngine.UI;
using System.Threading;

public class clientself : MonoBehaviour {
private byte[] data = new byte[1024];//这个是一个数据容器
public InputField inputcontext;
private Socket TcpClient;
string getmsg,oldmessage;
private Thread thread;
public Text te;
// Use this for initialization
void Start () {
ConnectToServer();

}

// Update is called once per frame
void Update () {
if (getmsg != null && getmsg!= oldmessage)
{
te.text += getmsg+"\n" ;
oldmessage = getmsg;
}

}
void ConnectToServer()
{
TcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//发起连接
TcpClient.Connect(new IPEndPoint(IPAddress.Parse("192.168.239.1"), 7788));

//创建新线程来接受消息
thread = new Thread(GetmessageFromServer);
thread.Start();
}

public void SendMessageToServer(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
TcpClient.Send(data);
}


public void GetmessageFromServer()
{

while (true)
{
//在接收数据之前 判断一下socket连接是否断开
if (TcpClient.Connected==false)
{
// TcpClient.Close();
break;//跳出循环 终止线程的执行
}

int getservermsglength = TcpClient.Receive(data);
getmsg = Encoding.UTF8.GetString(data, 0, getservermsglength);
Debug.Log(getmsg);

}
}

public void ClickButton()
{
string getmessages = inputcontext.text;
SendMessageToServer(getmessages);
}
}

然后打包unity客户端,开启服务器,然后再启动客户端,进行测试。

启动服务器界面:

Unity制作聊天室功能_客户端_02

启动两个客户端:

Unity制作聊天室功能_System_03

当一个客户端发送一条消息:

Unity制作聊天室功能_客户端_04

本文仅记录开发过程和思路,只是实现了聊天的核心功能,还有很多不完整的地方,例如退出按钮来切断与服务器的连接等等的问题。另外:我的IP地址每天都会变化的,我劝你善良

标签:聊天室,void,System,Unity,new,using,制作,public,客户端
From: https://blog.51cto.com/u_8378185/5990807

相关文章

  • unity的UI Event事件(Event Trigger和EventSystem对比)
    首先看Unity中UIEvent事件介绍上图中出现的组件在场景里都是unity里的事件相关的组件。例如:场景里EventSystem里默认就有Standaloneinputmodule这个组件(当然也可以随便加......
  • Unity3D之数据持久化储存
        首先我们来看两段Unity3D中实现数据读写的简单代码吧://保存数据PlayerPrefs.SetString("Name",mName);PlayerPrefs.SetInt("Age",mAge);PlayerPref......
  • Unity计时器功能
    在程序开发中很多地方会用到计时器进行倒计时的功能。下面我就写一个非常实用的倒计时功能。首先在场景中建一个Text用来显示倒计时的数值,然后给它加上倒计时的脚本Timer。......
  • 噩梦系列篇之Player之激光制作及射击完成
    下面完成player的射击功能。该功能设定为自动开枪,也就是用计时器来开枪。。。。首先给player加入一个脚本Gunshoot如图:然后要给player在射击的时候加入光效,很简单,在枪口的位......
  • Unity3D常用函数说明
    Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结。 Awake当前控......
  • Unity跳转场景报空指针解决
    当跳转场景时,有时候会出现空指针问题。解决办法:将即将跳转到的scene添加到BuildSettings里面。举个例子:例如从某个场景要跳转到network这个场景中,那么BuildSettings里面必......
  • Unity利用协同实现场景异步加载
    1.usingUnityEngine;2.usingSystem.Collections;3.4.publicclassFightTriggle:MonoBehaviour{5.privateAsyncOperationasync;6.i=0;7.......
  • Unity3D中Resources动态加载NGUI图片
    在NGUI中有些图片我需要动态进行变更或者加载,怎么办?首先在项目中创建一个Resources目录,接着把需要的图片放在这里面,可以有子文件夹么?当然可以,文件结构很重要哦~NGUI加载图片......
  • Unity和Easy AR制作一个AR的APP
    这个不是什么正规的项目。。。就是觉得AR好玩,研究了一下,很早之前就玩过了,现在再做的时候竟然忘记了。看来还是要记录一下的。。。功能就是:用手机扫描一个图片,然后会出现一个......
  • unity之人物移动到鼠标点击位置
    建立一个cube作为player,建立一个plane作为地面并且Tag设置为Terrain。将下面脚本NewBehaviourScript绑定到相机上。然后把cube拖到脚本里。点击鼠标左键在地面上即可看到cub......