首先创建一个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

GJM: Unity3D基于Socket通讯例子 [转载]的更多相关文章

  1. Unity3d基于Socket通讯例子(转)

    按语:按照下文,服务端利用网络测试工具,把下面客户端代码放到U3D中摄像机上,运行结果正确. http://www.manew.com/thread-102109-1-1.html 在一个网站上看到有 ...

  2. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  3. 用Robot Framework+python来测试基于socket通讯的C/S系统(网络游戏)

    项目终于换了方案,改用socket来实现而不是之前的http了,所以测试工具就不能用以前的了,因为测试人手少,逼不得已的必须要挖掘更多的自动化方案来弥补.于是先研究了下python的socket解决方 ...

  4. Unity3d网络游戏Socket通讯

    http://blog.csdn.net/wu5101608/article/details/37999409

  5. php和c++socket通讯(基于字节流,二进制)

    研究了一下PHP和C++socket通讯,用C++作为服务器端,php作为客户端进行. socket通讯是基于协议的,因此,只要双方协议一致就行. 关于协议的选择:我看过网上大部分协议都是在应用层的协 ...

  6. C#基于Socket的CS模式的完整例子

    基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,首先设计服务器.打开VS2008,在D:\C#\ch17目录下建立名为SocketServer的Windows应用程序.打开工 ...

  7. 闲来无事,写个基于TCP协议的Socket通讯Demo

    .Net Socket通讯可以使用Socket类,也可以使用 TcpClient. TcpListener 和 UdpClient类.我这里使用的是Socket类,Tcp协议. 程序很简单,一个命令行 ...

  8. Android 基于Socket的聊天应用(二)

    很久没写BLOG了,之前在写Android聊天室的时候答应过要写一个客户(好友)之间的聊天demo,Android 基于Socket的聊天室已经实现了通过Socket广播形式的通信功能. 以下是我写的 ...

  9. 高性能、高可用性Socket通讯库介绍 - 采用完成端口、历时多年调优!(附文件传输程序)

    前言 本人从事编程开发十余年,因为工作关系,很早就接触socket通讯编程.常言道:人在压力下,才可能出非凡的成果.我从事的几个项目都涉及到通讯,为我研究通讯提供了平台,也带来了动力.处理socket ...

随机推荐

  1. KnockoutJS 3.X API 第四章 数据绑定(4) 控制流with绑定

    with绑定的目的 使用with绑定的格式为data-bind="with:attribute",使用with绑定会将其后所跟的属性看作一个新的上下文进行绑定.with绑定内部的所 ...

  2. Java语言的个人理解

    Java语言的个人理解(比价深层次吧) 大四的生活确实十分的奢靡,不锻炼,不读书,几乎就是当一天和尚撞一天钟的生活,太颓废了,还好自己不是这个样子,不过身体确实差了很多,昨天跑了一圈内环(4KM),今 ...

  3. angularJS之事件处理

    angularJS的事件不像js一样,会默认有冒泡和捕获,还有angularJS之间的同名控制器之间,也只是同名, 不会让他们关联起来,就是这个名字的控制器的数据的改变不会影响到另一个同名的控制器. ...

  4. JS面向对象逆向学习法,让难理解的统统一边去(1)~

    对于面向对象我只能说呵呵了,为什么呢,因为没对象--- 既然你看到了这里,说明你有一定的基础,虽然本系列文章并不会过多的讲述基础部分,请做好心理准备. 本篇比较简单,这篇文章的意义是让你明白学习面向对 ...

  5. ASP.NET MVC删除数据

    Index.cshtml @model IEnumerable<MvcExample.Models.Category> <script type="text/javascr ...

  6. javase基础复习攻略《一》

    作为一名软件工程专业,JAVA开发方向的大三本科学生,有必要把自己的学到的专业知识进行一下整理,一则方便自己了解自己的学习程度,二则帮助刚刚接触这一门语言的童鞋了解学习,本人来自与河南理工大学,介绍完 ...

  7. PHP 自制日历

    最近的一个项目中,需要将数据用日历方式显示,网上有很多的JS插件,后面为了自己能有更大的控制权,决定自己制作一个日历显示.如下图所示: 一.计算数据 1.new一个Calendar类 2.初始化两个下 ...

  8. 为网格布局图片打造的超炫 CSS 加载动画

    今天,我想与大家分享一些专门为网格布局的图像制作的很酷的 CSS 加载动画效果.您可以把这些效果用在你的作品集,博客或任何你想要的网页中.设置很简单.我们使用了下面这些工具库来实现这个效果: Norm ...

  9. Windows Azure HandBook (10) 测试本地网络到微软云的延迟

    <Windows Azure Platform 系列文章目录> 之前遇到一些微软云的客户,在使用海外数据中心的时候,需要评估本地网络到微软云网络的延迟. 我们建议部署到微软云上的服务,离最 ...

  10. Javascript动画效果(三)

    Javascript动画效果(三) 前面我们已经介绍了速度动画.透明度动画.多物体运动和任意值变化,并且我们在Javascript动画效果(二)中介绍到我们封装了一个简单的插件雏形,接下来我们对前面的 ...