基于Socket實現客戶端和服務端的Tcp通信(C#)

0.前言

使用C#和Unity實現復刻Liar’s bar中的功能
軟件開發大作業
本系列文章用于記錄與分享開發過程中使用到的知識點,以及常見錯誤
本文主要描述有關網絡編程的內容

目錄

  • 0.前言
  • 1.使用Socket搭建Server
    • 1.1Server端的Socket連接
    • 1.2 Server端接收Client的信息
    • 1.3 Server端接收信息后,處理信息
    • 1.4 Server端給Client端發送信息
    • 1.5 小結
  • 2.Client端 搭建Socket連接
    • 2.0 前言
    • 2.1 連接服務器
    • 2.2 Unity中怎么轉換Json
  • 3.遠程聯機
    • 3.1SakuraFrp
    • 3.2 Client端

1.使用Socket搭建Server

1.1Server端的Socket連接

public static void waitClient{//ipv4地址,此處使用localhoststring host = "127.0.0.1";//端口號,需要與其他端口占用不同,例如3306,8080等//client端與此處端口相同即可string port = "6657";//創建ipIPEndPoint pos = new IPEndPoint(IPAddress.Parse(host), port);Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);listener.Bind(pos);//最多接收3個人的連接,參數可以改變listener.Listen(3);Socket sclient;String name;byte[] buffer = new byte[1024];Player p;int len;//監聽客戶端的連接while (true){//接收到客戶端連接 保存到sclient對象中sclient = listener.Accept();//并給這個對象單獨開一個監聽線程,在文后會再詳細說明Thread listen = new Thread(new ParameterizedThreadStart(listenerClient));listen.Start(sclient);}
}static void Main(String[] args){//為等待客戶端連接創建一個線程Thread wait = new Thread(new ThreadStart(waitClient));wait.Start();
}

1.2 Server端接收Client的信息

 static void listenerClient(Socket s){byte[] buffer = new byte[1024];while (true){Message msg;try{int len = s.Receive(buffer);string str = Encoding.UTF8.GetString(buffer, 0, len);//根據&進行分割//由于客戶端和服務端發送信息有延遲,//傳輸時在每個信息后面加&可以分清楚信息的范圍foreach (string s in str.Split('&')){if (s.Length > 0){//反序列成msg對象 發送的是json格式的數據//這里用的是NewtonSoft.Json可以在NuGet引入依賴msg = JsonConvert.DeserializeObject<Message>(s);//將msg加入到queue中//上鎖 使線程同步//這里的toDoListLock的聲明為        
//private static readonly object toDoListLock = new object();lock (toDoListLock){//這里的toDoList的聲明為:
//private static Queue<Message> toDoList = new Queue<Message>();toDoList.Enqueue(msg);}}}}catch (SocketException){//常見try-catch,不做過多贅述break;}}}
//常見Msg類
class Message
{public String type;public String info;//構造器public Message(string type, string info){this.type = type;this.info = info;}
}

1.3 Server端接收信息后,處理信息

//也需要給本類啟動一個線程,
//Thread toDo = new Thread(new ThreadStart(toDoListClient));
//toDo.startstatic void toDoListClientOperation(){while (true){//循環監聽,如果此時隊列中無信息就進入下次循環if (toDoList.Count == 0){continue;}//得到msg對象Message msg = toDoList.Dequeue();switch(msg.type){//根據類型進行對應操作即可 此處省略}}}

1.4 Server端給Client端發送信息

 static void sendMsg(string type, string info,Socket socket){Message msg = new Message(type, info);string str = JsonConvert.SerializeObject(msg);//將json字符串轉成字符數組并最后加上一個&//添加&的原因已在1.2中說明,此處省略byte[] bytes = Encoding.UTF8.GetBytes(str + '&');//發送信息socket.Send(bytes);}

1.5 小結

大體思路就是一個線程用于接收Client的連接,一個線程用于接收Client的信息,一個線程專門用于處理信息
面對Server端要被多個Client端連接時,可以創建數組保存這些Socket

2.Client端 搭建Socket連接

2.0 前言

由于Client端與Server端搭建類似,此處只寫如何連接,后面的收發信息則不過多贅述

2.1 連接服務器

//與Server端保持一致
string host = "127.0.0.1";
string port = "6657";
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(host, port);

2.2 Unity中怎么轉換Json

在Unity項目中引入NewtonSoft.Json.dll后發現經常會導致程序崩潰,
Unity中自帶一個處理JSON的類:JsonUtility 類
常用API:
JsonUtility.ToJson(param)
JsonUtility.FromJson<>(param)

3.遠程聯機

這里簡單提供一種思路:內網穿透
在代碼實現方面與上面相同,只不過host和port要改變

3.1SakuraFrp

這里用SakuraFrp實現內網穿透
搭建時本機IP去看當前聯網的屬性中IPV4的地址
(注意:此時開啟服務器的電腦本地IP不是127.0.0.1,要去Wlan那里看具體的ip是什么)
搭建選擇TCP
附SakuraFrp的官方地址:https://www.natfrp.com/
Server端的ip填寫ipv4的地址,端口就寫搭建時開放的端口
(注:Server端電腦的端口應該設置為開放)
筆者曾使用該軟件進行游戲聯機,所以想到這里能用(doge)

3.2 Client端

啟動SakuraFrp該隧道后,在日志信息中會給出映射的ip和端口
日志信息
冒號前面是host,后面是port。
則Client端的host=“211.149.167.185”,port=28821

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63348.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63348.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63348.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【mysql】如何查看大表記錄行數

目錄 1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS2. 查詢 INFORMATION_SCHEMA 表3. 使用索引統計信息4. 維護行數緩存5. 使用分區計數 1. 使用 ANALYZE TABLE 和 SHOW TABLE STATUS 1.ANALYZE TABLE 可以更新表的統計信息&#xff0c;然后使用 SHOW TABLE STATUS 來查看估算的…

文件斷點續傳(視頻播放,大文件下載)

客戶端每次請求取大文件部分數據。 瀏覽器播放mp4視頻時&#xff0c;會首先傳Range消息頭&#xff0c;檢測到206狀態碼&#xff0c;和Content-Range&#xff0c;Accept-Ranges 會自動請求余下數據。后端需要在文件任意偏移量取數據。 參考&#xff1a; springboot項目實現斷…

游戲AI實現-尋路算法(A*)

A*&#xff08;A-star&#xff09;是一種圖遍歷和尋路算法&#xff0c;由于其完整性、最優性和最佳效率&#xff0c;它被用于計算機科學的許多領域。給定一個加權圖、一個源節點和一個目標節點&#xff0c;該算法將找到從源到目標的最短路徑&#xff08;相對于給定的權重&#…

any/all 子查詢優化規則的原理與解析 | OceanBase查詢優化

背景 在通常情況下&#xff0c;當遇到包含any/all子查詢的語句時&#xff0c;往往需要遵循嵌套執行的方式&#xff0c;因此其查詢效率較低。Oceanbase中制定了相應的any/all子查詢優化規則&#xff0c;能夠能夠識別并優化符合條件的any/all子查詢&#xff0c;從而有效提升查詢…

[HNOI2002] 營業額統計 STL - set集合

文章目錄 [HNOI2002] 營業額統計題目描述樣例輸入 #1樣例輸出 #1 提示題解相關知識點set [HNOI2002] 營業額統計 STL - set解題 題目描述 Tiger 最近被公司升任為營業部經理&#xff0c;他上任后接受公司交給的第一項任務便是統計并分析公司成立以來的營業情況。 Tiger 拿出…

汽車供應鏈 “劇變”開始,“智能感知潛在龍頭”誕生

智能汽車產業鏈“劇變”已經開啟&#xff0c;智能感知軟硬件能力的權重正在不斷被放大。 比如滿足高階泊車的第二代AK2超聲波傳感器、滿足人機共駕場景需求的電子外后視鏡&#xff08;CMS&#xff09;、iTOF 3D成像視覺感知&#xff08;用于艙內監控&#xff09;等新產品&…

Latex中表格添加底部文本注釋并調整對齊

如何實現從第一個表到第三個表的轉換&#xff0c; 其中主要涉及到兩點&#xff1a; &#xff08;1&#xff09;底部腳注與表格自動對齊并縮進換行 &#xff08;2&#xff09;表格自適應頁面寬度 底部腳注的對齊與換行縮進需要用到 \usepackage{threeparttable} \usepackage{…

SQL 查詢方式比較:子查詢與自連接

在 SQL 中&#xff0c;子查詢和自連接是兩種常見的查詢方式&#xff0c;它們的功能雖然可以相同&#xff0c;但實現的方式不同。本文通過具體示例&#xff0c;深入探討這兩種查詢方式&#xff0c;并配合數據展示&#xff0c;幫助大家理解它們的使用場景和差異。 數據示例 假設…

html基礎-認識html

1.什么是html html是瀏覽器可以識別的的標記語言&#xff0c;我們在瀏覽器瀏覽的網頁就是一個個的html文檔 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>認識html</title> </head> <body><h1…

linux 無網絡安裝mysql

下載地址 通過網盤分享的文件&#xff1a;mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz 鏈接: https://pan.baidu.com/s/1qm48pNfGYMqBGfoqT3hxPw?pwd0012 提取碼: 0012 安裝 解壓 tar -zxvf mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz mv /usr/mysql-5.7.33-linux-glibc2.1…

利用高德API獲取整個城市的公交路線并可視化(七)

本篇文章是對我們從高德拿到的公交/地鐵的json文件的精細化處理的一個深入解析&#xff0c;通過對這些原始數據進行詳細的清洗、轉換和分析&#xff0c;我們通過對數據的質量和可用性的提升&#xff0c;來為后續的數據精細化處理和研究做基礎數據的支撐&#xff0c;從而為后續的…

OGV格式如何轉換成MP4格式?五款視頻格式轉換工具

在數字時代&#xff0c;視頻已成為我們日常生活、工作和學習中不可或缺的一部分。而不同的設備和平臺往往支持不同的視頻格式&#xff0c;這就需要對視頻進行格式轉換。 OGV&#xff08;Ogg Video File&#xff09;是一種使用OGG開源格式的容器&#xff0c;用于存儲帶或不帶音頻…

番外篇 | Hyper-YOLO:超圖計算與YOLO架構相結合成為目標檢測新的SOTA !

前言:Hello大家好,我是小哥談。Hyper-YOLO,該方法融合了超圖計算以捕捉視覺特征之間復雜的高階關聯。傳統的YOLO模型雖然功能強大,但其頸部設計存在局限性,限制了跨層特征的融合以及高階特征關系的利用。Hyper-YOLO在骨干和頸部的聯合增強下,成為一個突破性的架構。在COC…

C語言小練習-打印字母倒三角

編寫一個程序&#xff0c;在用戶輸入某個大寫字母后&#xff0c;產生一個金字塔圖案。 #include <stdio.h>int main(int argc,char *argv[]) {char ch; loop:printf("請輸入大寫字母&#xff01;\n");scanf("%c",&ch);getchar();if(ch < A ||…

FutureCompletableFuture實戰

1. Callable&Future&FutureTask介紹 直接繼承Thread或者實現Runnable接口都可以創建線程&#xff0c;但是這兩種方法都有一個問題就是&#xff1a;沒有返回值&#xff0c;也就是不能獲取執行完的結果。因此java1.5就提供了Callable接口來實現這一場景&#xff0c;而Fu…

什么是MyBatis

MyBatis是一款優秀的持久層框架&#xff0c;它支持定制化SQL、存儲過程以及高級映射。以下是關于MyBatis的詳細介紹&#xff1a; 一、MyBatis的起源與發展 MyBatis本是Apache的一個開源項目iBATIS&#xff0c;2010年這個項目由Apache遷移到了Google Code&#xff0c;并且改名…

阿爾茨海默癥數據集,使用yolo,voc,coco格式對2013張原始圖片進行標注,可識別輕微,中等和正常的癥狀

阿爾茨海默癥數據集,使用yolo&#xff0c;voc&#xff0c;coco格式對2013張原始圖片進行標注&#xff0c;可識別輕微&#xff0c;中等&#xff0c;嚴重和正常的癥狀 數據集分割 訓練組100&#xff05; 2013圖片 有效集&#xff05; 0圖片 測試集&#xf…

[代碼隨想錄21二叉樹]二叉樹的修改和改造,修剪二叉樹,將有序數組轉為二叉搜索樹

前言 二叉樹章節最后的題目了&#xff0c;就是對搜索二叉樹的改造&#xff0c; 題目鏈接 669. 修剪二叉搜索樹 - 力扣&#xff08;LeetCode&#xff09; 108. 將有序數組轉換為二叉搜索樹 - 力扣&#xff08;LeetCode&#xff09; 一、修剪二叉搜索樹 思路&#xff1a;等會…

Android 13 Aosp SystemServer功能裁剪(PackageManager.hasSystemFeature())

系統定制,裁剪Wifi,bt等模塊 UI部分可參考: SystemUI 隱藏下拉快捷面板部分模塊(wifi,bt,nfc等)入口 Android系統啟動后Zygote進程會forkSystemServer進程。SystemServer啟動Andorid服務. frameworks/base/services/java/com/android/server/SystemServer.java if (contex…

Scala的惰性求值:深入理解與實踐

在編程中&#xff0c;我們經常需要處理那些計算成本高昂或者可能永遠不會用到的值。在這種情況下&#xff0c;惰性求值&#xff08;Lazy Evaluation&#xff09;是一種非常有用的策略。它允許我們推遲計算&#xff0c;直到這些值真正需要被使用。Scala&#xff0c;作為一種多功…