unity使用socket編程實(shí)現(xiàn)聊天室功能
本文實(shí)例為大家分享了unity使用socket實(shí)現(xiàn)聊天室功能的具體代碼,供大家參考,具體內(nèi)容如下
示例:
什么是Socket:
Socket(套接字),用來描述IP地址和端口,是通信鏈的句柄,應(yīng)用程序可以通過Socket向網(wǎng)絡(luò)發(fā)送請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求!Socket是支撐TCP/IP協(xié)議的網(wǎng)絡(luò)通信的基本操作單元,是對(duì)網(wǎng)絡(luò)通信過程中端點(diǎn)的抽象表示,包含了進(jìn)行網(wǎng)絡(luò)通信所必須的五種信息:連接使用的協(xié)議,本地主機(jī)的IP地址,本地遠(yuǎn)程的協(xié)議端口,遠(yuǎn)地主機(jī)的IP地址,遠(yuǎn)地進(jìn)程的協(xié)議端口。
通信模型:
服務(wù)端實(shí)現(xiàn)連接的步驟
1.創(chuàng)建Socket,綁定IP和端口。
2.調(diào)用Accept()監(jiān)聽客戶端請(qǐng)求。
3.簡歷連接后,通過輸入流讀取客戶端發(fā)送的請(qǐng)求。
4.通過輸出流向客戶端發(fā)送信息。
5.關(guān)閉相關(guān)資源。
客戶端實(shí)現(xiàn)連接的步驟
1.創(chuàng)建Socket,指明需要連接的服務(wù)器地址和端口號(hào)。
2.建立連接后向服務(wù)器發(fā)送請(qǐng)求。
3.相應(yīng)服務(wù)器信息。
4.關(guān)閉相關(guān)資源。
基本操作:
public Socket (System.Net.Sockets.AddressFamily addressFamily, System.Net.Sockets.SocketType socketType, System.Net.Sockets.ProtocolType protocolType);
創(chuàng)建一個(gè)Socket調(diào)用他的構(gòu)造函數(shù);
addressFamily參數(shù)指定類使用的尋址方案Socket
socketType參數(shù)指定類的類型 Socket
protocolType 參數(shù)指定所使用的協(xié)議Socket
這三個(gè)參數(shù)不是獨(dú)立的。 某些地址族限制可與它們一起使用的協(xié)議,而類型通常Socket是協(xié)議中的隱式。 如果地址族、 Socket類型和協(xié)議類型的組合導(dǎo)致無效 Socket ,則此構(gòu)造函數(shù)會(huì)引發(fā) SocketException。
Bind()
如果需要使用特定的本地終結(jié)點(diǎn),請(qǐng)使用方法。 必須先調(diào)用, Bind然后才能調(diào)用Listen()方法。
在調(diào)用之前 ,必須先創(chuàng)建 IPEndPoint 用于與數(shù)據(jù)通信的本地。
Listen()Connect()
將Socket置于偵聽狀態(tài)。Listen導(dǎo)致面向連接的Socket監(jiān)聽傳入的連接嘗試。 backlog參數(shù)指定可以排隊(duì)等待接受的傳入連接的數(shù)量。
Connect與遠(yuǎn)程主機(jī)建立連接。
Accept()
為新建連接創(chuàng)建新的Socket。Accept從偵聽套接字的連接請(qǐng)求隊(duì)列中同步提取第一個(gè)掛起的連接請(qǐng)求,然后創(chuàng)建并返回一個(gè)新的Socket。
Receive()
接收來自綁定的Socket的數(shù)據(jù)。Receive方法將數(shù)據(jù)讀入 buffer 參數(shù),并返回成功讀取的字節(jié)數(shù)。
Send()
將數(shù)據(jù)發(fā)送到連接的Socket。Send將數(shù)據(jù)同步發(fā)送到或方法中指定的遠(yuǎn)程主機(jī)并返回成功發(fā)送的字節(jié)數(shù)。
Poll()
確定 Socket 的狀態(tài)。microSeconds等待響應(yīng)的時(shí)間(以微秒為單位)?;?mode 參數(shù)中傳遞的輪詢模式值的 Socket 的狀態(tài)。
Close()
關(guān)閉 Socket 連接并釋放所有關(guān)聯(lián)的資源。
使用Socket創(chuàng)建一個(gè)簡單的聊天室
服務(wù)端
寫了一控制臺(tái)應(yīng)用,也可以移植到其他平臺(tái)。
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using System.Net; using System.Threading; namespace MyServer { class Client { private Socket clientSocket; private Thread t; private byte[] data = new byte[1024]; public Client(Socket s) { clientSocket = s; //啟動(dòng)一個(gè)線程接受數(shù)據(jù); t = new Thread(ReceiveMessage); t.Start(); } private void ReceiveMessage() { while (true) { //判斷連接是否斷開 if (clientSocket.Poll(10, SelectMode.SelectRead)) { clientSocket.Close(); break;//跳出循環(huán) } int length = clientSocket.Receive(data); string message = Encoding.UTF8.GetString(data, 0, length); //接受到數(shù)據(jù)要分發(fā)到客戶端 Console.WriteLine("收到:" + message); Program.BroadcastMessage(message); } } public void SendMessage(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } public bool Connected { get { return clientSocket.Connected; } } } class Program { //存儲(chǔ)每一個(gè)客戶端 static List<Client> clientList = new List<Client>(); /// <summary> /// 服務(wù)器廣播這個(gè)消息 /// </summary> /// <param name="message"></param> 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 item in notConnectedList) { clientList.Remove(item); } } static void Main(string[] args) { Socket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //192.168.xx.xxx tcpServer.Bind(new IPEndPoint(IPAddress.Parse("192.168.xx.xxx"), 7788)); tcpServer.Listen(100); Console.WriteLine("服務(wù)器啟動(dòng)成功"); while (true) { Socket clientSocket = tcpServer.Accept(); Console.WriteLine("有一個(gè)客戶端連過來了"); Client client = new Client(clientSocket);//收發(fā)消息放到Client類中處理 clientList.Add(client); } } } }
客戶端
使用Unity編寫的客戶端
using System.Collections; using System.Collections.Generic; using System.Net.Sockets; using UnityEngine; using System.Net; using UnityEngine.UI; using System.Text; using System.Threading; public class MyClient : MonoBehaviour { public string ipaddress = "192.168.xx.xxx"; public int port=7788; private Socket clientSocket; private Thread t; private byte[] data = new byte[1024]; public InputField inputField; public Text chat; public InputField myName; public string message = ""; void Start() { ConnectToServer(); } private void Update() { if (message != null && message !="") { chat.text += "\n" + message; message = ""; } } private void ConnectToServer() { clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //發(fā)起連接 clientSocket.Connect(new IPEndPoint(IPAddress.Parse(ipaddress), port)); //創(chuàng)建一個(gè)新的線程接受消息 t = new Thread(ReceiveMessage); t.Start(); } //循環(huán)接受消息 void ReceiveMessage() { while (true) { if (clientSocket.Connected == false) break; int length = clientSocket.Receive(data); message = Encoding.UTF8.GetString(data, 0, length); // chat.text += "\n" + message; } } void SendMessages(string message) { byte[] data = Encoding.UTF8.GetBytes(message); clientSocket.Send(data); } public void OnSendButtonClick() { string value = myName.text+":"+ inputField.text; SendMessages(value); inputField.text = ""; } private void OnDestroy() { t.Abort(); clientSocket.Shutdown(SocketShutdown.Both);//既不接受也不發(fā)送 clientSocket.Close();//關(guān)閉連接 } }
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
DevExpress設(shè)置TreeList圖片節(jié)點(diǎn)背景色的方法
這篇文章主要介紹了DevExpress設(shè)置TreeList圖片節(jié)點(diǎn)背景色的方法,需要的朋友可以參考下2014-08-08C#中List轉(zhuǎn)IList的實(shí)現(xiàn)
本文主要介紹了C#中List轉(zhuǎn)IList的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07C#實(shí)現(xiàn)簡單的3DES加密解密功能示例
這篇文章主要介紹了C#實(shí)現(xiàn)簡單的3DES加密解密功能,結(jié)合實(shí)例形式分析了C#實(shí)現(xiàn)3DES加密解密的定義、使用等具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-08-08C#根據(jù)前臺(tái)傳入實(shí)體名稱實(shí)現(xiàn)動(dòng)態(tài)查詢數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了C#如何根據(jù)前臺(tái)傳入實(shí)體名稱實(shí)現(xiàn)動(dòng)態(tài)查詢數(shù)據(jù)的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-04-04利用WCF雙工模式實(shí)現(xiàn)即時(shí)通訊
這篇文章主要介紹了利用WCF雙工模式實(shí)現(xiàn)即時(shí)通訊的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09