[unity3d]聊天功能的实现

由于这段时间比较忙,所以也很久没发布过新的教程,这几天刚好要为一个项目写服务端程序,所以顺便也在Unity3d里面实现了一个简单的客户端,多个客户端一同使用就是一个简单的公共聊天室了。服务端为一个控制台程序使用C#实现,当然,在Unity3d中也相应地使用了C#语言实现客户端,服务端和客户端能实现消息的互通,当服务端接收到某客户端发送过来的消息时将会对客户端列表成员进行广播,这是公共聊天室的最基本的形式。Socket通讯是网络游戏最为基础的知识,因此这个实例能向有志投身于网业的初学者提供指导意义。


SocketClient.jpg


下面开始贴出实例的完整代码,工程完整的代码将过几天上传到网盘共广大网友下载!请大家密切留意!

Program.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Net.Sockets;

  6. namespace TestServer
  7. {
  8. class Program
  9. {
  10. // 设置连接端口
  11. const int portNo = 500;

  12. static void Main(string[] args)
  13. {
  14. // 初始化服务器IP
  15. System.Net.IPAddress localAdd = System.Net.IPAddress.Parse("127.0.0.1");

  16. // 创建TCP侦听器
  17. TcpListener listener = new TcpListener(localAdd, portNo);

  18. listener.Start();

  19. // 显示服务器启动信息
  20. Console.WriteLine("Server is starting...\n");

  21. // 循环接受客户端的连接请求
  22. while (true)
  23. {
  24. ChatClient user = new ChatClient(listener.AcceptTcpClient());

  25. // 显示连接客户端的IP与端口
  26. Console.WriteLine(user._clientIP + " is joined...\n");
  27. }
  28. }
  29. }
  30. }
复制代码
ChatClient.cs
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections;
  6. using System.Net.Sockets;

  7. namespace TestServer
  8. {
  9. class ChatClient
  10. {
  11. public static Hashtable ALLClients = new Hashtable(); // 客户列表

  12. private TcpClient _client;// 客户端实体
  13. publicstring _clientIP; // 客户端IP
  14. private string _clientNick; // 客户端昵称

  15. private byte[] data; // 消息数据

  16. private bool ReceiveNick = true;

  17. public ChatClient(TcpClient client)
  18. {
  19. this._client = client;

  20. this._clientIP = client.Client.RemoteEndPoint.ToString();

  21. // 把当前客户端实例添加到客户列表当中
  22. ALLClients.Add(this._clientIP, this);

  23. data = new byte[this._client.ReceiveBufferSize];

  24. // 从服务端获取消息
  25. client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
  26. }

  27. // 从客戶端获取消息
  28. public void ReceiveMessage(IAsyncResult ar)
  29. {
  30. int bytesRead;

  31. try
  32. {
  33. lock (this._client.GetStream())
  34. {
  35. bytesRead = this._client.GetStream().EndRead(ar);
  36. }

  37. if (bytesRead < 1)
  38. {
  39. ALLClients.Remove(this._clientIP);

  40. Broadcast(this._clientNick + " has left the chat");

  41. return;
  42. }
  43. else
  44. {
  45. string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);

  46. if (ReceiveNick)
  47. {
  48. this._clientNick = messageReceived;

  49. Broadcast(this._clientNick + " has joined the chat.");

  50. //this.sendMessage("hello");

  51. ReceiveNick = false;
  52. }
  53. else
  54. {
  55. Broadcast(this._clientNick + ">" + messageReceived);

  56. }
  57. }

  58. lock (this._client.GetStream())
  59. {
  60. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
  61. }
  62. }
  63. catch (Exception ex)
  64. {
  65. ALLClients.Remove(this._clientIP);

  66. Broadcast(this._clientNick + " has left the chat.");
  67. }
  68. }

  69. // 向客戶端发送消息
  70. public void sendMessage(string message)
  71. {
  72. try
  73. {
  74. System.Net.Sockets.NetworkStream ns;

  75. lock (this._client.GetStream())
  76. {
  77. ns = this._client.GetStream();
  78. }

  79. // 对信息进行编码
  80. byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);

  81. ns.Write(bytesToSend, 0, bytesToSend.Length);
  82. ns.Flush();
  83. }
  84. catch (Exception ex)
  85. {

  86. }
  87. }

  88. // 向客户端广播消息
  89. public void Broadcast(string message)
  90. {
  91. Console.WriteLine(message);

  92. foreach (DictionaryEntry c in ALLClients)
  93. {
  94. ((ChatClient)(c.Value)).sendMessage(message + Environment.NewLine);
  95. }
  96. }

  97. }
  98. }
复制代码
Unity3d客户端的代码ClientHandler.cs:
  1. using UnityEngine;
  2. using System.Collections;

  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Text;
  7. using System.Net.Sockets;

  8. public class ClientHandler : MonoBehaviour
  9. {
  10. const int portNo = 500;
  11. private TcpClient _client;
  12. byte[] data;

  13. // Use this for initialization
  14. void Start ()
  15. {

  16. }

  17. // Update is called once per frame
  18. void Update ()
  19. {

  20. }

  21. public string nickName = "";
  22. public string message = "";
  23. public string sendMsg = "";

  24. void OnGUI()
  25. {
  26. nickName = GUI.TextField(new Rect(10, 10, 100, 20), nickName);
  27. message = GUI.TextArea(new Rect(10, 40, 300, 200), message);
  28. sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);

  29. if(GUI.Button(new Rect(120, 10, 80, 20), "Connect"))
  30. {
  31. //Debug.Log("hello");

  32. this._client = new TcpClient();
  33. this._client.Connect("127.0.0.1", portNo);

  34. data = new byte[this._client.ReceiveBufferSize];

  35. //SendMessage(txtNick.Text);
  36. SendMessage(nickName);

  37. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
  38. };

  39. if(GUI.Button(new Rect(230, 250, 80, 20), "Send"))
  40. {
  41. SendMessage(sendMsg);
  42. sendMsg = "";
  43. };
  44. }

  45. public void SendMessage(string message)
  46. {
  47. try
  48. {
  49. NetworkStream ns = this._client.GetStream();

  50. byte[] data = System.Text.Encoding.ASCII.GetBytes(message);

  51. ns.Write(data, 0, data.Length);
  52. ns.Flush();
  53. }
  54. catch (Exception ex)
  55. {
  56. //MessageBox.Show(ex.ToString());
  57. }
  58. }

  59. public void ReceiveMessage(IAsyncResult ar)
  60. {
  61. try
  62. {
  63. int bytesRead;

  64. bytesRead = this._client.GetStream().EndRead(ar);

  65. if (bytesRead < 1)
  66. {
  67. return;
  68. }
  69. else
  70. {

  71. Debug.Log(System.Text.Encoding.ASCII.GetString(data, 0, bytesRead));

  72. message += System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
  73. }

  74. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);


  75. }
  76. catch (Exception ex)
  77. {

  78. }
  79. }
  80. }
复制代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值