1. 程式人生 > >unity_小功能實現(客戶端相互通信功能)

unity_小功能實現(客戶端相互通信功能)

直接 endpoint 客戶端和服務器端 network hat sockets odi family void

服務器端:在VS中新建項目,用於服務器的搭建

using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading;

namespace Chat_Server
{

class Client
{
private Socket clientSocket;
private Thread t;
private byte[] data = new byte[1024];//接收數據容器

static List<Client> clientList = new List<Client>();

static void Main(string[] args)
{
Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.43.231"), 7788));
tcpServer.Listen(100);

Console.WriteLine("server is runing");

//死循環:解決只能接收一個客戶端的問題
while (true)
{
Socket clientSocket = tcpServer.Accept();//暫停,當有客戶端連接時執行下面代碼
Console.WriteLine("有一個客戶端連接上了");
Client client = new Client(clientSocket);
clientList.Add(client);
}

}
//是否連接成功,true為成功
public bool Connected
{
get { return clientSocket.Connected; }
}
public Client(Socket s)
{
clientSocket = s;
//啟動一個線程 處理客戶端的數據接收
t = new Thread(ReceiveMessage);
t.Start();
}
//接收從客戶端發送的消息
private void ReceiveMessage()
{
//一直接收客戶端的數據
while (true)
{
//在接收數據之前 判斷一下socket連接是否斷開,等待10毫秒響應。斷開連接時:
if (clientSocket.Poll(10, SelectMode.SelectRead))
{
clientSocket.Close();
break;//跳出循環 終止線程的執行
}

//接收消息
int length = clientSocket.Receive(data);
string message = Encoding.UTF8.GetString(data, 0, length);

BroadcastMessage(message);
Console.WriteLine("收到了消息:" + message);
}
}
//服務器向客戶端發消息
public void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
//服務器端向客戶端廣播消息
public static void BroadcastMessage(string message)
{
var notConnectedList = new List<Client>();
foreach (var client in clientList)
{
if (client.Connected) //連接成功的廣播消息
client.SendMessage(message);
else //連接失敗的存儲在另一個泛型集合裏,方便後面移除
{
notConnectedList.Add(client);
}
}
//移除未連接的客戶端
foreach (var temp in notConnectedList)
{
clientList.Remove(temp);
}
}

}
}

Unity客戶端:

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class ChatManager : MonoBehaviour
{
public string ipaddress = "192.168.43.231";
public int port = 7788;

public UIInput textInput;
public UILabel chatLabel;

private Socket clientSocket;
private Thread t;

private byte[] data = new byte[1024];//數據容器
private string message = "";//接收到的消息容器

void Start () {
ConnectToServer();
}
void Update () {
if (message != null && message != "")
{
chatLabel.text += "\n" + message;
message = "";//清空消息
}
}
void ConnectToServer()
{
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
//跟服務器端建立連接
clientSocket.Connect( new IPEndPoint(IPAddress.Parse(ipaddress),port) );

//創建一個新的線程 用來接收消息
t = new Thread(ReceiveMessage);
t.Start();
}
//接收消息
void ReceiveMessage()
{
while (true)
{
if (clientSocket.Connected == false)
break;
int length = clientSocket.Receive(data);
message = Encoding.UTF8.GetString(data, 0, length);

}
}
//發消息
void SendMessage(string message)
{
byte[] data = Encoding.UTF8.GetBytes(message);
clientSocket.Send(data);
}
//發送按鈕
public void OnSendButtonClick()
{
string value = textInput.value;
SendMessage(value);
textInput.value = "";
}

void OnDestroy()
{
clientSocket.Shutdown(SocketShutdown.Both);

clientSocket.Close();//關閉連接
}
}
註意:我們在客戶端和服務器端都使用了線程,線程的作用在於加快出庫速度,提高性能。服務器端,使用線程接收數據,客戶端使用線程發送數據。

unity_小功能實現(客戶端相互通信功能)