Unity C# 简单的Chat 聊天功能的实现
c# 实现 简单 功能 Unity 聊天 chat
2023-09-11 14:20:50 时间
目录
在 Unity 和 VS 2017 ,使用C#开发简单的聊天程序,包括服务端和客服端。
1、打开 VS 2017 ,新建一个控制台程序,具体如下图
2、 服务端 Main 程序
using System;
using System.Net.Sockets;
namespace TestServer_XAN
{
class Program
{
// 设置连接端口
const int portNo = 500;
/// <summary>
/// 聊天服务程序入口
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 服务器地址(根据自己的需要填写)
System.Net.IPAddress localAdd = System.Net.IPAddress.Parse("127.0.0.1");
// 绑定 IP 和端口号 开始监听客端户接入
TcpListener listener = new TcpListener(localAdd,portNo);
listener.Start();
Console.WriteLine("Server is Starting...\n");
// 死循环监听客户端连接服务器
while (true) {
ChatClient user = new ChatClient(listener.AcceptTcpClient());
Console.WriteLine(user._clientIP + " is joined...\n");
}
}
}
}
using System;
using System.Collections;
using System.Net.Sockets;
namespace TestServer_XAN
{
public class ChatClient
{
/// <summary>
/// 客户端的集合
/// </summary>
public static Hashtable AllClients = new Hashtable();
/// <summary>
/// Tcp 客户端
/// </summary>
private TcpClient _client;
/// <summary>
/// 客户端 IP
/// </summary>
public string _clientIP;
/// <summary>
/// 客户端昵称
/// </summary>
private string _clientNickname;
/// <summary>
/// 客户端数据
/// </summary>
private byte[] data;
/// <summary>
/// 客户端连接的第一次
/// </summary>
private bool ReceiveNick = true;
/// <summary>
/// 构造函数u,初始化数据,并且绑定事件
/// </summary>
/// <param name="client"></param>
public ChatClient(TcpClient client) {
this._client = client;
this._clientIP = client.Client.RemoteEndPoint.ToString();
AllClients.Add(this._clientIP, this);
data = new byte[this._client.ReceiveBufferSize];
client.GetStream().BeginRead(data,0,System.Convert.ToInt32(this._client.ReceiveBufferSize),ReceiveMessage,null);
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="ar"></param>
public void ReceiveMessage(IAsyncResult ar) {
int bytesRead;
try {
lock (this._client.GetStream()) {
bytesRead = this._client.GetStream().EndRead(ar);
}
if (bytesRead < 1)
{
AllClients.Remove(this._clientIP);
Broadcast(this._clientNickname + " has left the chat");
return;
}
else {
string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
// 连接服务器的时候
if (ReceiveNick)
{
this._clientNickname = messageReceived;
Broadcast(this._clientNickname + ">" + messageReceived);
ReceiveNick = false;
}
else {
Broadcast(this._clientNickname + ">" + messageReceived);
}
}
lock (this._client.GetStream()) {
this._client.GetStream().BeginRead(data,0,System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage,null);
}
}
catch (Exception ex) {
AllClients.Remove(this._clientIP);
Broadcast(this._clientNickname + "has left ths chat.");
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="message"></param>
public void SendMessage(string message) {
try {
System.Net.Sockets.NetworkStream ns;
lock (this._client.GetStream()) {
ns = this._client.GetStream();
}
byte[] bytesTosend = System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(bytesTosend,0,bytesTosend.Length);
ns.Flush();
}
catch (Exception ex) {
}
}
/// <summary>
/// 广播消息
/// </summary>
/// <param name="message"></param>
public void Broadcast(string message) {
Console.WriteLine(message);
foreach (DictionaryEntry c in AllClients)
{
((ChatClient)(c.Value)).SendMessage(message + Environment.NewLine);
}
}
}
}
3、Unity 实现客户端代码
using System;
using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
public class ClientHandler : MonoBehaviour
{
const int portNo = 500;
private TcpClient _client;
byte[] data;
public string nickName = "";
public string message = "";
public string sendMsg = "";
/// <summary>
/// UI界面
/// </summary>
void OnGUI() {
nickName = GUI.TextField(new Rect(10,10,100,20),nickName);
message = GUI.TextField(new Rect(10, 40, 300, 200), message);
sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);
if (GUI.Button(new Rect(120,10,80,20),"connect")) {
Connect();
}
if (GUI.Button(new Rect(230,250,80,20), "Send")) {
Send();
}
}
/// <summary>
/// 连接服务器
/// </summary>
public void Connect() {
//服务器的IP和端口号
this._client = new TcpClient("127.0.0.1",portNo);
data = new byte[this._client.ReceiveBufferSize];
SendMessage(nickName);
this._client.GetStream().BeginRead(data,0,System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
}
/// <summary>
/// 发送
/// </summary>
private void Send() {
SendMessage(sendMsg);
sendMsg = "";
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="message"></param>
public void SendMessage(string message) {
try {
NetworkStream ns = this._client.GetStream();
byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
ns.Write(data, 0, data.Length);
ns.Flush();
}
catch (Exception ex) {
}
}
/// <summary>
/// 接收消息
/// </summary>
/// <param name="ar"></param>
public void ReceiveMessage(IAsyncResult ar) {
try
{
int bytesRead;
bytesRead = this._client.GetStream().EndRead(ar);
if (bytesRead < 1)
{
return;
}
else {
Debug.Log(System.Text.Encoding.ASCII.GetString(data,0,bytesRead));
message += System.Text.Encoding.ASCII.GetString(data,0,bytesRead);
}
this._client.GetStream().BeginRead(data,0,System.Convert.ToInt32(this._client.ReceiveBufferSize),ReceiveMessage, null);
}
catch (System.Exception ex)
{
}
}
}
4、运行效果
相关文章
- C#实现语音朗读功能
- C# 字符串加密解密方法
- WinForm实现简单的拖拽文件到出题的功能(C#)(3)
- C#实现Xml序列化与反序列化的方法
- c#分页工具类,完美实现List分页
- C#实现人脸识别【Users】
- 揽货最短路径解决方案算法 - V2(增加了时间维度-客户允许的服务时间段,C#/JAVA同步实现,带python作图)
- C# 对象池的实现(能限制最大实例数量,类似于WCF的MaxInstanceCount功能)
- [AaronYang]C#人爱学不学[2]
- C#实体类与XML相互转换
- C#中DllImport用法汇总
- C#实现office文档转换为PDF格式
- C# 用Attribute实现AOP事务 [C# | AOP | Attribute | ContextAttribute | IContributeObjectSink | IMessageSink ]
- c# 优化代码的一些规则——字符串使用优化[四]
- C# 实体类序列化与反序列化一 (XmlSerializer)
- C# index of 用法(转载)
- 【彩票】彩票预测算法(一):离散型马尔可夫链模型C#实现
- Atitit.http代理的实现 代码java php c# python
- Atitit.java相比c#.net的优点 优缺点 v2 q330
- Atitit .c#的未来新特性计划草案
- atitit.复合变量,也就是类似$$a的变量的原理与实现 java c#.net php js
- Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
- Atitit. 悬浮窗口的实现 java swing c# .net c++ js html 的实现
- 编程笔试(解析及代码实现):国内各大银行(招商银行/浦发银行等)在线笔试常见题目(猴子吃桃/字符串逆序输出/一段话输出字的个数/单词大小转换等)及其代码实现(Java/Python/C#等)之详细攻略
- C# Excel批注“哪种开发语言最好”
- C# Dictionary里面的TryAdd方法
- Thrift初探:简单实现C#通讯服务程序
- C#简单实现表达式目录树(Expression)