基于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.rhkb.cn/news/492086.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse 如何设置项目、不同类型文件的 utf8 编码

编码问题一直是软件开发中让人头疼的小细节&#xff0c;尤其是团队协作中&#xff0c;若编码格式不统一&#xff0c;乱码问题便会频繁出现。那么如何在 Eclipse 中统一设置项目和文件的 UTF-8 编码&#xff0c;避免因编码问题造成不必要的困扰呢&#xff1f;今天&#xff0c;我…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

java后端环境配置

因为现在升学了&#xff0c;以前本来想毕业干java的&#xff0c;很多java的环境配置早就忘掉了&#xff08;比如mysql maven jdk idea&#xff09;&#xff0c;想写个博客记录下来&#xff0c;以后方便自己快速搭建环境 JAVA后端开发配置 环境配置jdkideamavenMySQLnavicate17…

Edge Scdn用起来怎么样?

Edge Scdn&#xff1a;提升网站安全与性能的最佳选择 在当今互联网高速发展的时代&#xff0c;各种网络攻击层出不穷&#xff0c;特别是针对网站的DDoS攻击威胁&#xff0c;几乎每个行业都可能成为目标。为了确保网站的安全性与稳定性&#xff0c;越来越多的企业开始关注Edge …

CN-fnst::CTF Web

文章目录 ezphpez_pythoncomment_mefilechecker_revengei_am_eeeeeshili ezphp 直接数组绕过, 执行命令 GET: usn[]1&usn1[]1&signenv POST: pwd[]2&pwd1[]2 ez_python file参数任意文件读取 读取源码: ?fileapp.py from flask import Flask, request, render_…

AI自我进化的新篇章:谷歌DeepMind推出苏格拉底式学习,语言游戏解锁无限潜能

各位AI爱好者、技术研究者&#xff0c;大家好&#xff01;今天我们来聊聊一个令人兴奋的AI研究新进展——谷歌DeepMind推出的“苏格拉底式学习”方法。这项研究的独特之处在于&#xff0c;它让AI在没有外部数据的情况下&#xff0c;通过“语言游戏”实现自我进化&#xff0c;这…

《类和对象:基础原理全解析(上篇)》

目录 一、浅谈面向过程和面向对象二、C 中的结构体&#xff08;struct&#xff09;1. C 中 struct 的使用 三、C 中的类&#xff08;class&#xff09;四、类的封装性1. 类成员的权限控制关键字2. 权限控制关键字的使用 五、类的六大默认成员函数介绍六、构造函数1. 使用构造函…

电子应用设计方案-59:智能电动床系统方案设计

智能电动床系统方案设计 一、引言 智能电动床作为一种高端家居产品&#xff0c;旨在为用户提供更加舒适、便捷和个性化的睡眠体验。本方案将详细介绍智能电动床系统的设计架构、功能特点和技术实现。 二、系统概述 1. 系统目标 - 实现床体的多部位电动调节&#xff0c;满足不…

电商环境下的财务ERP系统架构

先介绍一下自己的工作经历&#xff0c;2002年开始进入ERP实施行业&#xff0c;专注于O记EBS系统&#xff0c;正好赶上中国经济和信息化高度发展的阶段&#xff0c;先后实施过很多大国企和民企的大型ERP项目&#xff0c;在实施过程中逐渐对ERP系统的架构、模块设计有更深入的认识…

【WRF教程第3.2期】预处理系统 WPS详解:以4.5版本为例

预处理系统 WPS 详解&#xff1a;以4.5版本为例 WPS 嵌套域&#xff08;WPS Nested Domains&#xff09;USGS 和 MODIS 土地利用重力波拖拽方案静态数据&#xff08;Gravity Wave Drag Scheme Static Data&#xff09;1. 什么是重力波拖拽方案&#xff08;GWDO&#xff09;静态…

在Proteus软件仿真STM32F103寄存器方式PID调速电机

因为电脑中只装了IAR&#xff0c;所以本次编译环境就只能是IAR&#xff0c;所用软件版本是9.32.1。 本次仿真为&#xff0c;纯手写代码&#xff0c;不用任何库&#xff0c;包括启动文件也是手写。 首先是启动文件&#xff0c;该文件是汇编文件&#xff0c;命名为start.s&…

QtitanChart组件——高效、灵活的Qt数据可视化解决方案

在现代应用开发中&#xff0c;数据可视化已经成为不可或缺的一部分。无论是商业分析工具、财务报表、工程图表&#xff0c;还是科学实验数据展示&#xff0c;如何以直观、易理解的方式展示数据&#xff0c;往往决定了软件的可用性与用户体验。对于Qt开发者来说&#xff0c;Qtit…

YOLOv11融合[CVPR2024]Starnet中的star block特征提取模块

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《Rewrite the Stars》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2403.19967 代码链接&#xff1a;https://github.com/ma-xu/Rewri…

LabVIEW农机自主导航监控系统

随着现代农业技术的快速发展&#xff0c;自主导航农机的需求日益增加&#xff0c;提高作业效率和减少劳动成本成为农业现代化的关键目标。本文介绍了一个基于LabVIEW的农机自主导航监控系统的开发案例&#xff0c;该系统通过先进的传感器与控制技术&#xff0c;实现农机在田间作…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

php基础:正则表达式

1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止&#xff0c;我们前面所用过的精确&#xff08;文本&#xff09;匹配也是一种正则表达式。 在PHP中&#xff0c;正则表达式一般是由正规字…

Postman接口测试:全局变量/接口关联/加密/解密

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 全局变量和环境变量 全局变量&#xff1a;在postman全局生效的变量&#xff0c;全局唯一 环境变量&#xff1a;在特定环境下生效的变量&#xff0c;本环境内唯一 …

vue响应式数据-修改对象的属性值,视图不更新

如图&#xff1a; 一&#xff1a;问题是&#xff1a; 我把数据处理后能console.log()打印出来&#xff0c;但是页面的内容不能同步的更新渲染&#xff1b; 二&#xff1a;要求&#xff1a; 在数组循环列表里面&#xff0c;我点击单个的item按钮时&#xff0c;需要实时加载进度…

configure错误:“C compiler cannot create executables“

执行./configure命令出现如下奇怪的错误&#xff0c;百思不得姐&#xff1a; ./configure命令的日志文件为config.log&#xff0c;发生错误时&#xff0c;该文件的内容&#xff1a; This file contains any messages produced by compilers while running configure, to aid d…