unity3d游戏开发之实现基于Socket通讯的公共聊天室.doc_第1页
unity3d游戏开发之实现基于Socket通讯的公共聊天室.doc_第2页
unity3d游戏开发之实现基于Socket通讯的公共聊天室.doc_第3页
unity3d游戏开发之实现基于Socket通讯的公共聊天室.doc_第4页
unity3d游戏开发之实现基于Socket通讯的公共聊天室.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

由于这段时间比较忙,所以也很久没发布过新的教程,这几天刚好要为一个项目写服务端程序,所以顺便也在Unity3d里面实现了一个简单的客户端,多个客户端一同使用就是一个简单的公共聊天室了。服务端为一个控制台程序使用C#实现,当然,在Unity3d中也相应地使用了C#语言实现客户端,服务端和客户端能实现消息的互通,当服务端接收到某客户端发送过来的消息时将会对客户端列表成员进行广播,这是公共聊天室的最基本的形式。Socket通讯是网络游戏最为基础的知识,因此这个实例能向有志投身于网游行业的初学者提供指导意义。这篇文章来自狗刨学习网Program.cs1. using System;2. using System.Collections.Generic;3. using System.Linq;4. using System.Text;5. using System.Net.Sockets;6.7. namespace TestServer8. 9. class Program10. 11. / 设置连接端口12. const int portNo = 500;13.14. static void Main(string args)15. 16. / 初始化服务器IP17. System.Net.IPAddress localAdd = System.Net.IPAddress.Parse();18.19. / 创建TCP侦听器20. TcpListener listener = new TcpListener(localAdd, portNo);21.22. listener.Start();23.24. / 显示服务器启动信息25. Console.WriteLine(Server is starting.n);26.27. / 循环接受客户端的连接请求28. while (true)29. 30. ChatClient user = new ChatClient(listener.AcceptTcpClient();31.32. / 显示连接客户端的IP与端口33. Console.WriteLine(user._clientIP + is joined.n);34. 35. 36. 37. 复制代码ChatClient.cs1. 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.8. namespace TestServer9. 10. class ChatClient11. 12. public static Hashtable ALLClients = new Hashtable(); / 客户列表13.14. private TcpClient _client;/ 客户端实体15. publicstring _clientIP; / 客户端IP16. private string _clientNick; / 客户端昵称17.18. private byte data; / 消息数据19.20. private bool ReceiveNick = true;21.22. public ChatClient(TcpClient client)23. 24. this._client = client;25.26. this._clientIP = client.Client.RemoteEndPoint.ToString();27.28. / 把当前客户端实例添加到客户列表当中29. ALLClients.Add(this._clientIP, this);30.31. data = new bytethis._client.ReceiveBufferSize;32.33. / 从服务端获取消息34. client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);35. 36.37. / 从客戶端获取消息38. public void ReceiveMessage(IAsyncResult ar)39. 40. int bytesRead;41.42. try43. 44. lock (this._client.GetStream()45. 46. bytesRead = this._client.GetStream().EndRead(ar);47. 48.49. if (bytesRead + messageReceived);74.75. 76. 77.78. lock (this._client.GetStream()79. 80. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);81. 82. 83. catch (Exception ex)84. 85. ALLClients.Remove(this._clientIP);86.87. Broadcast(this._clientNick + has left the chat.);88. 89. 90.91. / 向客戶端发送消息92. public void sendMessage(string message)93. 94. try95. 96. System.Net.Sockets.NetworkStream ns;97.98. lock (this._client.GetStream()99. 100. ns = this._client.GetStream();101. 102.103. / 对信息进行编码104. byte bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);105.106. ns.Write(bytesToSend, 0, bytesToSend.Length);107. ns.Flush();108. 109. catch (Exception ex)110. 111. 112. 113. 114.115. / 向客户端广播消息116. public void Broadcast(string message)117. 118. Console.WriteLine(message);119.120. foreach (DictionaryEntry c in ALLClients)121. 122. (ChatClient)(c.Value).sendMessage(message + Environment.NewLine);123. 124. 125.126. 127. 复制代码Unity3d客户端的代码ClientHandler.cs:1. using UnityEngine;2. using System.Collections;3.4. using System;5. using System.Collections.Generic;6. using System.ComponentModel;7. using System.Text;8. using System.Net.Sockets;9.10. public class ClientHandler : MonoBehaviour11. 12. const int portNo = 500;13. private TcpClient _client;14. byte data;15. 16. / Use this for initialization17. void Start ()18. 19. 20. 21. 22. / Update is called once per frame23. void Update ()24. 25. 26. 27. 28. public string nickName = ;29. public string message = ;30. public string sendMsg = ;31. 32. void OnGUI()33. 34. nickName = GUI.TextField(new Rect(10, 10, 100, 20), nickName);35. message = GUI.TextArea(new Rect(10, 40, 300, 200), message);36. sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);37. 38. if(GUI.Button(new Rect(120, 10, 80, 20), Connect)39. 40. /Debug.Log(hello);41. 42. this._client = new TcpClient();43. this._client.Connect(, portNo);44.45. data = new bytethis._client.ReceiveBufferSize;46.47. /SendMessage(txtNick.Text);48. SendMessage(nickName);49.50. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);51. ;52. 53. if(GUI.Button(new Rect(230, 250, 80, 20), Send)54. 55. SendMessage(sendMsg);56. sendMsg = ;57. ;58. 59. 60. public void SendMessage(string message)61. 62. try63. 64. NetworkStream ns = this._client.GetStream();65.66. byte data = System.Text.Encoding.ASCII.GetBytes(message);67.68. ns.Write(data, 0, data.Length);69. ns.Flush();70. 71. catch (Exception ex)72. 73. /MessageBox.Show(ex.ToString();74. 75. 76. 77. public void ReceiveMessage(IAsyncResult ar)78. 79. try80. 81. int bytesRead;82.83. bytesRead = this._client.GetStream().EndRead(ar);84.85. if (bytesRead 1)86. 87. return;88. 89. else90. 91. 92. Debug.Log(System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);93. 94. messa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论