Unity3d基于Socket通讯例子

本文提供了一个使用C# Socket实现Unity客户端与服务端通信的完整示例。通过控制台应用程序作为服务端,Unity项目作为客户端,实现了基本的消息收发功能。适合初学者学习网络编程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >





本人是新手,但是找了很久都找不到类似的通讯源码,后来终于在一个网站上看到有关于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, 0System.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, 0System.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(101010020), nickName);
  19.         message = GUI.TextArea(new Rect(1040300200), message);
  20.         sendMsg = GUI.TextField(new Rect(1025021020), sendMsg);
  21.         if (GUI.Button(new Rect(120108020)"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, 0System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
  30.         };
  31.         if (GUI.Button(new Rect(2302508020)"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, 0System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
  67.         }
  68.         catch (Exception ex)
  69.         {
  70.         }
  71.     }
  72. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值