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

如有版权问题 请联系我:[email protected]

时间: 2024-10-10 19:33:52

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

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

基于Socket服务器端实现本例主要是建立多客户端与服务器之间的数据传输,首先设计服务器.打开VS2008,在D:\C#\ch17目录下建立名为SocketServer的Windows应用程序.打开工程,往当前窗体中添加控件,如表17-6所示.表17-6  添加控件列表 控    件 Name Text ListBox lbInfo Label label Button button1 启动服务器 设计好的界面如图17-2所示. 接下来开始运用前面的知识设计服务器,主要分为以下步骤.(1)首先是

java进阶 ------ 基于Socket低层次网络编程

[本文是自己学习所做笔记,欢迎转载,但请注明出处:http://blog.csdn.net/jesson20121020] Socket通讯: 网络上的两个程序通过一个双向的通讯连接实现数据的交互,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 在传统的UNIX环境下可以操作TCP/IP协议的接口不止Socket一个,Socket所支持的协议种类不光

基于Socket实现网络编程

Socket是网络上两个程序间双向通讯的一端,它既可以发送请求,也可以接收请求,利用它可以方便的编写网络上数据的传递,在java中,有专门的类类处理用户的请求和响应.利用Socket 类的方法,就可以实现两台计算机之间的通信,那么怎么利用socket进行网络编程呢?我试试水~ 网络中的进程之间是如何进行通信的? 本地进程间通信(IPC)有很多种方法,简而言之可以归结为以下四类: 消息传递(管道,FIFO,消息队列); 同步(互斥量,条件变量,读写锁,文件和写记录锁,信号量): 内存共享(匿名的和

基于Socket的java网络编程

1.什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个十分流行的编程界面,一个Socket由一个IP地址和一个端口号唯一确定. 但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的.在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程. 2.Socket通讯的过程 Server端Listen(监听)

C语言 linux环境基于socket的简易即时通信程序

转载请注明出处:http://www.cnblogs.com/kevince/p/3891033.html   By Kevince 最近在看linux网络编程相关,现学现卖,就写了一个简易的C/S即时通信程序,代码如下: head.h 1 /*头文件,client和server编译时都需要使用*/ 2 #include <unistd.h> 3 #include <stdio.h> 4 #include <sys/types.h> 5 #include <sys

试解析Tomcat运行原理(一)--- socket通讯

关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使用这个系统呢?由此认识了IIS,它是一个web容器,天生的多线程,及时响应用户提交的请求返回html页面,这就是我了解的最初的web容器的功能,由此我们来认识tomcat也并不困难,可以的话,在了解完tomcat后我们可以继续了解jboss.jetty等,好我们进入主题. 我们在平时开发的过程中是在

基于Socket的Android聊天室

1        基于Socket的Android聊天室 Socket通信是网络通信中最常用的技术之一,通过Socket建立的可靠连接,可以让多个终端与服务器保持通信,最典型的应用是建立一个多人聊天程序.本实例使用ServerSocket建立聊天服务器.将服务器端所有的通讯线程保存到一个集合当中,当有用户发来数据,则转发给所有用户,实现聊天室效果.Android端通过使用Socket建立客户端链接,并且在AsyncTask中执行网络读写的任务,将用户输入的内容发送到服务器,并接收服务器发来的数据

UDP之socket通讯

分享一个简单的socket通讯,简单易理解 TCP协议与UDP协议的区别 1.基于连接与无连接:2.对系统资源的要求(TCP较多,UDP少):3.UDP程序结构较简单:4.流模式与数据报模式 :5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证. 客户端 1 package com.UDP.socket; 2 3 import java.net.DatagramPacket; 4 import java.net.DatagramSocket; 5 import java.

【Web后端笔记】基于Socket实现的简单Web服务器搭建

我们在地址栏中输入的内容称为通用资源标记符(Universal Resource Identifier,URI)它有很多种样式,在Web中我们通常称为统一资源定位符(Uniform Resource Locator,URL)的形式,它的格式如下: 协议://主机[.端口号][绝对路径[?参数]] 在http://www.cnblogs.com/DebugLZQ/中,http表示协议名称;www.cnblogs.com表示主机的地址:可选的端口号没有出现,那么,将使用http协议默认的端口号80: