TCP實現一個簡易的聊天室 (Unity&&C#完成)

来源:https://www.cnblogs.com/ASsss/archive/2019/02/28/10450562.html
-Advertisement-
Play Games

效果展示 TCP Transmission Control Protocol 傳輸控制協議 TCP是面向連接的流模式(俗稱:網路流)。即傳輸數據之前源端和終端建立可靠的連接,保證數據傳輸的正確性。 流模式:由於建立連接,收到的數據都是同一主機發送的,所有可以發送端Write一次,接收端Read多次; ...


  效果展示

TCP

Transmission Control Protocol 傳輸控制協議

TCP面向連接的流模式(俗稱:網路流)。即傳輸數據之前源端和終端建立可靠的連接,保證數據傳輸的正確性 

流模式:由於建立連接,收到的數據都是同一主機發送的,所有可以發送端Write一次,接收端Read多次;也可以發送端Write多次,接收端Read多次。但每次傳輸數據最大為1460位元組。

 

 

實現步驟

 

服務端                                                                       客戶端

獲取本機終結點                                                   獲取伺服器終結點  

創建TcpListener對象,開啟偵聽器                      創建TcpClient對象                         

等待客戶端連接                                                   連接伺服器

獲取針對客戶端連接的網路流客戶端通信           通過網路流與伺服器通信                         

 ……                                                                        ……         

關閉連接                                                                關閉連接

 

using System.Collections;
using System.Collections.Generic;
using System.Net.Sockets;
using UnityEngine;
using Common;
using UnityEngine.UI;
using System.Net;
using System;
using System.Text;

/// <summary>
/// TCP 客戶端  發送消息
/// </summary>
public class ChatTCPClientTest : MonoBehaviour
{
    private InputField messageInput;
    private TcpClient tcpClient;
    private void Start()
    {

        var server = FindObjectOfType<ChatTCPServerTest>();
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(server.serverIP), server.serverPort);
        //創建終結點
        tcpClient = new TcpClient();
        //1. 創建Socket
        tcpClient.Connect(ep);  ////三次握手(連接請求)
        //使用指定的遠程網路終結點將客戶端連接到TCP主機
        messageInput = transform.FindChildByName("MessageInput").GetComponent<InputField>();
        transform.FindChildByName("Send").GetComponent<Button>().onClick.AddListener(OnSendButtonClient);
    }

    private void OnSendButtonClient()
    {
        SendChatMessage(messageInput.text);
    }
    private void SendChatMessage(string msg)
    {
        //獲取網路流
        NetworkStream stream = tcpClient.GetStream();
        //用於發送消息和接收消息

        byte[] dgramContent = Encoding.UTF8.GetBytes(msg);
        //傳入內容
        stream.Write(dgramContent, 0, dgramContent.Length);
        //寫入網路流  內容  從那開始發  發的長度
    }
    /// <summary>
    /// 3.關閉連接/釋放資源
    /// </summary>
    private void OnApplicationQuit()
    {
        tcpClient.Close();
    }
}
ChatTCPClientTest

 

using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UIWidgetsSamples;
using UnityEngine;
using Common;
using System;

/// <summary>
/// 服務端  TCP 接收消息
/// </summary>
public class ChatTCPServerTest : MonoBehaviour
{
    public string serverIP;
    //IP
    public int serverPort;
    ////1.創建Socket對象
    private ChatView chatView;
    private void Start()
    {
        chatView = transform.FindChildByName("ChatView").GetComponent<ChatView>();
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(serverIP), serverPort);
        //1). 創建對象並開啟監聽
        serverlisten = new TcpListener(ep);//需要一個終結點
        serverlisten.Start();

        //2.線程
        thread = new Thread(ReceiveClient);
        thread.Start();
    }
    private TcpListener serverlisten;
    private Thread thread;
    //2.開啟監聽
    //3.接收數據 顯示
    private void ReceiveClient()
    {
        TcpClient client = serverlisten.AcceptTcpClient();
        //接收消息                      //AcceptTcpClient() 接受掛起連接請求
        NetworkStream stream = client.GetStream();
        //讀取網路流到容器
        byte[] date = new byte[1024];
        //返回讀了多少位元組
        //Read讀取消息 如果沒有讀取到  線程阻塞
        //如果有多個客戶端 要迴圈接收  將讀到的信息放到線程中
        int count;
        while((count=stream.Read(date,0,date.Length))>0) //count為0  表示客戶端下線
        {
            //解析
            string msg = Encoding.UTF8.GetString(date);
            ThreadCrossHelper.Instance.ExecuteOnMainThread(() => { ShowMessage(msg); });
        }
        client.Close();//關閉Socket對象 自動釋放流

    }

    private void ShowMessage(string msg)
    {
        chatView.DataSource.Add(new ChatLine()
        {
            UserName = "AnnS",
            Message = msg,
            Time = DateTime.Now,
            Type = ChatLineType.User,
        });
    }
    //4.關閉
    public void OnApplicationQuit()
    {
        thread.Abort();
        serverlisten.Stop();
    }
}
ChatTCPServerTest

中間發生連接請求過程(三次握手) , 斷開連接(四次揮手)

三次握手

所謂三次握手就是建立TCP連接的過程,需要客戶端和服務端總共發送3個包確認連接成功。在socket編程中,這一過程由客戶端執行connect來觸發。

簡而言之

第一次,客戶端服務端發出連接請求數據包 “我想跟你聊會,可以嗎?

,服務端向客戶端發送同意連接和要求同步的數據包可以,什麼時候

第三次,客戶端再發出一個數據包確認伺服器的同步要求就現在。

四次揮手

所謂四次揮手就是終止TCP連接的過程,需要客戶端和服務端總共發送4個包以確認連接斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發

簡而言之

第一次,客戶端服務端發送斷開請求數據包 “我都說完了,今天就到這吧

,服務端向客戶端發送同意斷開數據包恩,好的。

第三次,服務端再向客戶端發送斷開請求數據報那我掛了啊?

第四次客戶端再向服務端發送確認斷開數據報“拜拜”

此時服務端斷開連接,客戶端過會發現服務端沒有回覆,也斷開連接。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 事務的概念 一組要麼同時執行成功,要麼同時執行失敗的SQL語句,是資料庫操作的一個執行單元! 事務開始於: 連接到資料庫上,並執行一條DML語句(insert,update或delete),前一個事務結束後,又輸入了一條DML語句。 事務結束於: 1)執行commit或rollback語句。 2)執 ...
  • 在ASP.NET網站項目實際上線運行的過程中,有時候在運行環境下會出現400錯誤或者500錯誤,這些錯誤預設的頁面都不友好,比較簡單單調,其實我們可以自行設置這些錯誤所對應的頁面,讓這些錯誤跳轉到我們指定的路徑。此文將介紹如何在ASP.NET項目中設置404錯誤和500錯誤為例。 首先我們可以到網上 ...
  • 今天,我們將分享 Visual Studio 2019 的發佈候選版(RC 版) - 這是在 4 月 2 日的[虛擬發佈活動](https://launch.visualstudio.com/)上正式發佈之前的最後步驟之一。 您可以在 visualstudio.com/downloads 下載 RC... ...
  • 一、程式運行時產生的錯誤通過使用一種稱為異常(Exception)的機制在程式中傳遞,通過異常處理(Exception Handling)有助於處理程式運行過程中發生的意外或異常情況;異常可由CLR和客戶端代碼拋出(Throw),拋出的異常會在調用堆棧中傳遞,直到遇到可以捕獲該異常的語句進行處理並中 ...
  • 1 使用 WebShellKillerTool 進行網站文件掃描 能抓出一般後臺漏洞文件 2 控制面板-->文件夾選項-->顯示隱藏文件-->上面兩個如果是勾選狀態要去除 否則 有的文件會偽裝未受保護的系統文件 而不能被查看 3 檢查global 文件是否被篡改 4 檢查網站JS是否被註入特殊文件 ...
  • 1.前言 本篇文章通過ASP.NET Core的EPPlus包去操作Excel(導入導出),其使用原理與NPOI類似,導出Excel的時候不需要電腦上安裝office,非常好用 2.使用 新建一個ASP.NET Core Web應用程式(模型視圖控制器),還有一個類庫,SDK2.1版本,解決方案如下 ...
  • 在一些場合裡面,我們需要對一些記錄進行顏色標註處理,以標記記錄的信息重要性或者進行類別區分,如在客戶關係管理系統裡面,我們需要對客戶信息進行不同顏色的標註,方便對不同類別的管理,畢竟顏色區分還是比較直觀快速的一種。本隨筆介紹在我們的CRM客戶關係管理系統中,對客戶信息的標註處理和顯示區分的實現。 ...
  • 一. 基本數據 每個EF上下文實例都有一個 ChangeTracker(更改跟蹤器),它負責跟蹤需要寫入資料庫的更改。 當更改實體類的實例時(修改屬性,刪除實例,新建實例等),這些更改會記錄在 ChangeTracker 中,然後在調用 SaveChanges 時被寫入資料庫。 此資料庫提供程式負責 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...