Unity3D教程:实现基于Socket通讯的公共聊天室
来源:互联网 发布:太空工程师 编程 编辑:程序博客网 时间:2024/05/01 22:51
多个客户端一同使用就是一个简单的公共聊天室。服务端为一个控制台程序使用C#实现,当然,在Unity3D中也相应地使用了C#语言实现客户端,服务端和客户端能实现消息的互通,当服务端接收到某客户端发送过来的消息时将会对客户端列表成员进行广播,这是公共聊天室的最基本的形式。Socket通讯是网络游戏最为基础的知识,因此这个实例能向有志投身于网游行业的初学者提供指导意义。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Net.Sockets;
- namespace TestServer
- {
- class Program
- {
-
- const int portNo = 500;
- static void Main(string[] args)
- {
-
- System.Net.IPAddress localAdd = System.Net.IPAddress.Parse("127.0.0.1");
-
- TcpListener listener = new TcpListener(localAdd, portNo);
- listener.Start();
-
- Console.WriteLine("Server is starting...\n");
-
- while (true)
- {
- ChatClient user = new ChatClient(listener.AcceptTcpClient());
-
- Console.WriteLine(user._clientIP + " is joined...\n");
- }
- }
- }
- }
ChatClient.cs- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Collections;
- using System.Net.Sockets;
- namespace TestServer
- {
- class ChatClient
- {
- public static Hashtable ALLClients = new Hashtable();
- private TcpClient _client;
- public string _clientIP;
- private string _clientNick;
- private byte[] data;
- private bool ReceiveNick = true;
- public ChatClient(TcpClient client)
- {
- this._client = client;
- this._clientIP = client.Client.RemoteEndPoint.ToString();
-
- ALLClients.Add(this._clientIP, this);
- data = new byte[this._client.ReceiveBufferSize];
-
- client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
- }
-
- public void ReceiveMessage(IAsyncResult ar)
- {
- int bytesRead;
- try
- {
- lock (this._client.GetStream())
- {
- bytesRead = this._client.GetStream().EndRead(ar);
- }
- if (bytesRead < 1)
- {
- ALLClients.Remove(this._clientIP);
- Broadcast(this._clientNick + " has left the chat");
- return;
- }
- else
- {
- string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
- if (ReceiveNick)
- {
- this._clientNick = messageReceived;
- Broadcast(this._clientNick + " has joined the chat.");
-
- ReceiveNick = false;
- }
- else
- {
- Broadcast(this._clientNick + ">" + messageReceived);
- }
- }
- lock (this._client.GetStream())
- {
- this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
- }
- }
- catch (Exception ex)
- {
- ALLClients.Remove(this._clientIP);
- Broadcast(this._clientNick + " has left the chat.");
- }
- }
-
- public void sendMessage(string message)
- {
- try
- {
- System.Net.Sockets.NetworkStream ns;
- lock (this._client.GetStream())
- {
- ns = this._client.GetStream();
- }
-
- byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);
- ns.Write(bytesToSend, 0, bytesToSend.Length);
- ns.Flush();
- }
- catch (Exception ex)
- {
-
- }
- }
-
- public void Broadcast(string message)
- {
- Console.WriteLine(message);
- foreach (DictionaryEntry c in ALLClients)
- {
- ((ChatClient)(c.Value)).sendMessage(message + Environment.NewLine);
- }
- }
- }
- }
Unity3d客户端的代码ClientHandler.cs- using UnityEngine;
- using System.Collections;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Text;
- using System.Net.Sockets;
- public class ClientHandler : MonoBehaviour
- {
- const int portNo = 500;
- private TcpClient _client;
- byte[] data;
-
-
- void Start ()
- {
-
- }
-
-
- void Update ()
- {
-
- }
-
- public string nickName = "";
- public string message = "";
- public string sendMsg = "";
-
- void OnGUI()
- {
- nickName = GUI.TextField(new Rect(10, 10, 100, 20), nickName);
- message = GUI.TextArea(new Rect(10, 40, 300, 200), message);
- sendMsg = GUI.TextField(new Rect(10, 250, 210, 20), sendMsg);
-
- if(GUI.Button(new Rect(120, 10, 80, 20), "Connect"))
- {
-
-
- this._client = new TcpClient();
- this._client.Connect("127.0.0.1", portNo);
- data = new byte[this._client.ReceiveBufferSize];
-
- SendMessage(nickName);
- this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
- };
-
- if(GUI.Button(new Rect(230, 250, 80, 20), "Send"))
- {
- SendMessage(sendMsg);
- sendMsg = "";
- };
- }
-
- public void SendMessage(string message)
- {
- try
- {
- NetworkStream ns = this._client.GetStream();
- byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
- ns.Write(data, 0, data.Length);
- ns.Flush();
- }
- catch (Exception ex)
- {
-
- }
- }
-
- public void ReceiveMessage(IAsyncResult ar)
- {
- try
- {
- int bytesRead;
- bytesRead = this._client.GetStream().EndRead(ar);
- if (bytesRead < 1)
- {
- return;
- }
- else
- {
-
- Debug.Log(System.Text.Encoding.ASCII.GetString(data, 0, bytesRead));
-
- message += System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
- }
- this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
-
- }
- catch (Exception ex)
- {
-
- }
- }
- }
版权声明:转载时请以超链接形式标明文章原始出处和作者信息
0 0