• GJM: Unity3D基于Socket通讯例子 [转载]


    点击查看原图

    首先创建一个C# 控制台应用程序, 直接服务器端代码丢进去,然后再到Unity 里面建立一个工程,把客户端代码挂到相机上,运行服务端,再运行客户端。 高手勿喷!~!

    完全源码已经奉上,大家开始研究吧!! 嘎嘎嘎!

    服务端代码: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 SoketDemo
    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 SoketDemo
    8. {
    9. class ChatClient
    10. {
    11. public static Hashtable ALLClients = new Hashtable(); // 客户列表
    12. private TcpClient _client; // 客户端实体
    13. public string _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. }
    复制代码

    客户端代码 :ClientHandler

    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. public string nickName = "";
    14. public string message = "";
    15. public string sendMsg = "";
    16. void OnGUI()
    17. {
    18. nickName = GUI.TextField(new Rect(10, 10, 100, 20), nickName);
    19. message = GUI.TextArea(new Rect(10, 40, 300, 200), message);
    20. sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);
    21. if (GUI.Button(new Rect(120, 10, 80, 20), "Connect"))
    22. {
    23. //Debug.Log("hello");
    24. this._client = new TcpClient();
    25. this._client.Connect("127.0.0.1", portNo);
    26. data = new byte[this._client.ReceiveBufferSize];
    27. //SendMessage(txtNick.Text);
    28. SendMessage(nickName);
    29. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
    30. };
    31. if (GUI.Button(new Rect(230, 250, 80, 20), "Send"))
    32. {
    33. SendMessage(sendMsg);
    34. sendMsg = "";
    35. };
    36. }
    37. public void SendMessage(string message)
    38. {
    39. try
    40. {
    41. NetworkStream ns = this._client.GetStream();
    42. byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
    43. ns.Write(data, 0, data.Length);
    44. ns.Flush();
    45. }
    46. catch (Exception ex)
    47. {
    48. //MessageBox.Show(ex.ToString());
    49. }
    50. }
    51. public void ReceiveMessage(IAsyncResult ar)
    52. {
    53. try
    54. {
    55. int bytesRead;
    56. bytesRead = this._client.GetStream().EndRead(ar);
    57. if (bytesRead < 1)
    58. {
    59. return;
    60. }
    61. else
    62. {
    63. Debug.Log(System.Text.Encoding.ASCII.GetString(data, 0, bytesRead));
    64. message += System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
    65. }
    66. this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
    67. }
    68. catch (Exception ex)
    69. {
    70. }
    71. }
    72. }

     原 帖 地址 http://www.u3dchina.com/forum.php?mod=viewthread&tid=4741&extra=page%3D1%26filter%3Dsortid%26sortid%3D14%26sortid%3D14

    如有版权问题 请联系我:993056011@qq.com 

  • 相关阅读:
    mysql-5.7.15-winx64免安装版配置
    db2 表授权语句
    java 调用 .net webservice 示例
    打印内存高解决方案
    eclipse快捷键调试总结【转】
    DevExpress GridControl 自定义 summary 算法
    GEMR: Get the parent window for view
    弹出窗口
    WPF UI虚拟化
    WPF应用程序最小化到系统托盘
  • 原文地址:https://www.cnblogs.com/TDou/p/6068812.html
Copyright © 2020-2023  润新知