欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

unity使用socket編程實現(xiàn)聊天室功能

 更新時間:2021年11月17日 08:39:30   作者:九本才  
這篇文章主要為大家詳細介紹了unity使用socket編程實現(xiàn)聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了unity使用socket實現(xiàn)聊天室功能的具體代碼,供大家參考,具體內容如下

示例:

什么是Socket:

Socket(套接字),用來描述IP地址和端口,是通信鏈的句柄,應用程序可以通過Socket向網(wǎng)絡發(fā)送請求或者應答網(wǎng)絡請求!Socket是支撐TCP/IP協(xié)議的網(wǎng)絡通信的基本操作單元,是對網(wǎng)絡通信過程中端點的抽象表示,包含了進行網(wǎng)絡通信所必須的五種信息:連接使用的協(xié)議,本地主機的IP地址,本地遠程的協(xié)議端口,遠地主機的IP地址,遠地進程的協(xié)議端口。

通信模型:

服務端實現(xiàn)連接的步驟

1.創(chuàng)建Socket,綁定IP和端口。

2.調用Accept()監(jiān)聽客戶端請求。

3.簡歷連接后,通過輸入流讀取客戶端發(fā)送的請求。

4.通過輸出流向客戶端發(fā)送信息。

5.關閉相關資源。

客戶端實現(xiàn)連接的步驟

1.創(chuàng)建Socket,指明需要連接的服務器地址和端口號。

2.建立連接后向服務器發(fā)送請求。

3.相應服務器信息。

4.關閉相關資源。

基本操作:

public Socket (System.Net.Sockets.AddressFamily addressFamily, 
               System.Net.Sockets.SocketType socketType,
               System.Net.Sockets.ProtocolType protocolType);

創(chuàng)建一個Socket調用他的構造函數(shù);

addressFamily參數(shù)指定類使用的尋址方案Socket

socketType參數(shù)指定類的類型 Socket

protocolType 參數(shù)指定所使用的協(xié)議Socket

這三個參數(shù)不是獨立的。 某些地址族限制可與它們一起使用的協(xié)議,而類型通常Socket是協(xié)議中的隱式。 如果地址族、 Socket類型和協(xié)議類型的組合導致無效 Socket ,則此構造函數(shù)會引發(fā) SocketException。

Bind()

如果需要使用特定的本地終結點,請使用方法。 必須先調用, Bind然后才能調用Listen()方法。

在調用之前 ,必須先創(chuàng)建 IPEndPoint 用于與數(shù)據(jù)通信的本地。

Listen()Connect()

將Socket置于偵聽狀態(tài)。Listen導致面向連接的Socket監(jiān)聽傳入的連接嘗試。 backlog參數(shù)指定可以排隊等待接受的傳入連接的數(shù)量。

Connect與遠程主機建立連接。

Accept()

為新建連接創(chuàng)建新的Socket。Accept從偵聽套接字的連接請求隊列中同步提取第一個掛起的連接請求,然后創(chuàng)建并返回一個新的Socket。

Receive()

接收來自綁定的Socket的數(shù)據(jù)。Receive方法將數(shù)據(jù)讀入 buffer 參數(shù),并返回成功讀取的字節(jié)數(shù)。

Send()

將數(shù)據(jù)發(fā)送到連接的Socket。​​​​​​​Send將數(shù)據(jù)同步發(fā)送到或方法中指定的遠程主機并返回成功發(fā)送的字節(jié)數(shù)。

Poll()

確定 ​​​​​​​Socket 的狀態(tài)。microSeconds等待響應的時間(以微秒為單位)?;?mode 參數(shù)中傳遞的輪詢模式值的 Socket 的狀態(tài)。

Close()

關閉 ​​​​​​​Socket 連接并釋放所有關聯(lián)的資源。

使用Socket創(chuàng)建一個簡單的聊天室

服務端

寫了一控制臺應用,也可以移植到其他平臺。

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;
            //啟動一個線程接受數(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
    {
        //存儲每一個客戶端
        static List<Client> clientList = new List<Client>();
 
        /// <summary>
        /// 服務器廣播這個消息
        /// </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("服務器啟動成功");
 
            while (true)
            {
                Socket clientSocket = tcpServer.Accept();
                Console.WriteLine("有一個客戶端連過來了");
                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)建一個新的線程接受消息
        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();//關閉連接
    }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#在MEF框架中手動導入依賴模塊

    C#在MEF框架中手動導入依賴模塊

    這篇文章介紹了C#在MEF框架中手動導入依賴模塊的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • DevExpress設置TreeList圖片節(jié)點背景色的方法

    DevExpress設置TreeList圖片節(jié)點背景色的方法

    這篇文章主要介紹了DevExpress設置TreeList圖片節(jié)點背景色的方法,需要的朋友可以參考下
    2014-08-08
  • C#中List轉IList的實現(xiàn)

    C#中List轉IList的實現(xiàn)

    本文主要介紹了C#中List轉IList的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • c#添加Newtonsoft.Json包的操作

    c#添加Newtonsoft.Json包的操作

    這篇文章主要介紹了c#添加Newtonsoft.Json包的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • C# 大小寫轉換(金額)實例代碼

    C# 大小寫轉換(金額)實例代碼

    C# 大小寫轉換(金額)實例代碼,需要的朋友可以參考一下
    2013-03-03
  • 詳解C# Socket異步通信實例

    詳解C# Socket異步通信實例

    本篇文章主要介紹了C# Socket異步通信,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C#實現(xiàn)簡單的3DES加密解密功能示例

    C#實現(xiàn)簡單的3DES加密解密功能示例

    這篇文章主要介紹了C#實現(xiàn)簡單的3DES加密解密功能,結合實例形式分析了C#實現(xiàn)3DES加密解密的定義、使用等具體步驟與相關操作技巧,需要的朋友可以參考下
    2017-08-08
  • C#根據(jù)前臺傳入實體名稱實現(xiàn)動態(tài)查詢數(shù)據(jù)

    C#根據(jù)前臺傳入實體名稱實現(xiàn)動態(tài)查詢數(shù)據(jù)

    這篇文章主要為大家詳細介紹了C#如何根據(jù)前臺傳入實體名稱實現(xiàn)動態(tài)查詢數(shù)據(jù)的功能,文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-04-04
  • Unity3D UGUI特效之Image高斯模糊效果

    Unity3D UGUI特效之Image高斯模糊效果

    這篇文章主要為大家詳細介紹了Unity3D UGUI特效之Image高斯模糊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 利用WCF雙工模式實現(xiàn)即時通訊

    利用WCF雙工模式實現(xiàn)即時通訊

    這篇文章主要介紹了利用WCF雙工模式實現(xiàn)即時通訊的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09

最新評論