首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C# TCP套接字连接用意外字符替换返回数据

C# TCP套接字连接用意外字符替换返回数据
EN

Stack Overflow用户
提问于 2018-12-22 21:30:06
回答 1查看 790关注 0票数 0

我正在一个服务器-客户端认证系统上进行实验,我的目标是向TCP服务器发送一些细节,如mac id、ip地址等,然后服务器接收它,如果存在指定地址,检查数据库,如果存在,它将返回“0”作为返回数据。然后,客户端读取它并启动OnAuthorized函数。

因此,问题是,客户端发送数据,服务器读取数据,然后返回0,但在代码中,我看到

0\0\0\0\0\0

而不是控制台上的"0“,而是显示0,但是下一行相当向下,所以我假设它的空格字符是,但是Trim()应该删除它们,对吗?但事实并非如此。我使用断点并在HTML中检查返回值,并看到单个字符0,但它没有反映实际字符串。这是密码。

客户端

代码语言:javascript
运行
AI代码解释
复制
IPEndPoint IPEndPoint = new IPEndPoint(ServerIP, Constants.SecurityServerPort);
            Client.Connect(IPEndPoint);
            Logger.LogGenericInfo("Socket created to {0}", Client.RemoteEndPoint.ToString());
            byte[] sendmsg = Encoding.ASCII.GetBytes(MsgToSend);
            int Send = Client.Send(sendmsg);
            int Received = Client.Receive(Data);

            if(Data != null)
            {
                ReceivedData = Encoding.ASCII.GetString(Data).Trim(' ');
                Logger.LogGenericInfo(ReceivedData);
            }

            Client.Shutdown(SocketShutdown.Both);
            Client.Close();

服务器:

代码语言:javascript
运行
AI代码解释
复制
IPEndPoint localEndpoint = new IPEndPoint(IPAddress.Any, 7205);
        ConsoleKeyInfo key;
        int count = 0;
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        sock.Bind(localEndpoint);
        sock.Listen(5);
        while (true)
        {

            Console.WriteLine("\nWaiting for clients..{0}", count);
            Socket confd = sock.Accept();
            int b = confd.Receive(Buffer);
            data += Encoding.ASCII.GetString(Buffer, 0, b);
            Console.WriteLine("" + data);
            data = null;
            confd.Send(Message);
            Console.WriteLine("\n<< Continue 'y' , Exit 'e'>>");
            key = Console.ReadKey();
            if (key.KeyChar == 'e')
            {
                Console.WriteLine("\nExiting..Handled {0} clients", count);
                confd.Close();
                System.Threading.Thread.Sleep(5000);
                break;
            }
            confd.Close();
            count++;
        }

服务器返回数据= private static byte[] Message = Encoding.ASCII.GetBytes("0");

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-22 21:45:10

客户端将数据接收到其缓冲区中,但不使用所存储的接收字节数的值:

代码语言:javascript
运行
AI代码解释
复制
        int Received = Client.Receive(Data);

然后,将整个缓冲区转换为字符串,其中将包含许多NUL字符(ascii 0)和零字符数字(ascii 48)。如果缓冲区被重复使用,这也会重复旧的数据,并可能带来安全风险:

代码语言:javascript
运行
AI代码解释
复制
        if(Data != null)
        {
            ReceivedData = Encoding.ASCII.GetString(Data).Trim(' ');

顺便说一句,这个if永远是真的。也许你是说if(Received > 0)

然后,您尝试使用trim来修剪这些空间,但是您告诉c#将空格(ascii 32)修剪掉,它不是一个污染的空间,它是NUL (ascii 0)。

最好在服务器端执行您所做的操作,并使用Received字节数来限制GetString返回多少字符。这就是您在服务器端所做的工作:

代码语言:javascript
运行
AI代码解释
复制
        int b = confd.Receive(Buffer);
        data += Encoding.ASCII.GetString(Buffer, 0, b);

你在服务器上使用b。在你没有收到的客户端上。我不太清楚您为什么说data +=,因为这会将当前的数据添加到以前的数据中,但是这可能是有意的

顺便说一句,请避免命名方法作用域变量(在方法体内部定义的变量,如int Received,开头带有大写字母)。在c#中,这个约定适用于可公开访问的属性、方法、事件、类级变量等。很难阅读不遵循这些约定的代码,因为这些变量不是在它们的名称意味着定义它们的地方定义的。

您可能还会遇到此代码的问题,因为服务器只对客户端响应一次,然后在等待您的控制台输入时暂停。同样,这可能是有意为之,但似乎不太可能。我建议您改用异步式编程,以便在服务器端接收和处理数据,然后服务器将能够同时为多个客户端服务。现在,即使您删除了控制台交互,也很难做到这一点。虽然您可能希望这个服务器非常简单,但是对于“应该如何完成服务器”来说,“读取一些数据、做一些工作、编写一些数据”的“同步”方式并不是一个理想的介绍,因为第一个客户端必须在工作完成时等待,而第二个客户端必须等到第一个客户端离开。

最后一点(承诺)-在c#中内置了几种方法(比如微服务体系结构实现),在这些方式中,所有的低级错误、向套接字写入字节等等,它从我们身上夺走了,微软做得很好,我们所要做的就是定义一个服务,操作的名称(通过编写一个名为该东西的方法),并编写实现该操作的服务器端代码。然后,在客户端,我们基本上告诉visual studio“我想使用该服务”,它编写了连接它所需的所有客户端代码,因此客户端实质上分为两行(创建客户端,调用方法),服务器端大约有3行(声明方法、读取值、返回响应值),它的多线程、异步,工作完美,不是字节和编码、套接字操作、循环blah的混乱混合体。

用您在这里所做的方式来学习和欣赏底层的工作原理是很棒的,但这有点像编写您自己的显示驱动程序,而不是使用Nvidia的驱动程序;没有什么意义。

一个简单的hello world示例(与您所做的相同):https://learn.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-create-a-basic-wcf-web-http-service

关于servicehost的更详细信息:https://learn.microsoft.com/en-us/dotnet/framework/wcf/hosting-services

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53901437

复制
相关文章
Livy:基于Apache Spark的REST服务
Apache Spark提供的两种基于命令行的处理交互方式虽然足够灵活,但在企业应用中面临诸如部署、安全等问题。为此本文引入Livy这样一个基于Apache Spark的REST服务,它不仅以REST的方式代替了Spark传统的处理交互方式,同时也提供企业应用中不可忽视的多用户,安全,以及容错的支持。 背景 Apache Spark作为当前最为流行的开源大数据计算框架,广泛应用于数据处理和分析应用,它提供了两种方式来处理数据:一是交互式处理,比如用户使用spark-shell或是pyspark脚本启动Sp
CSDN技术头条
2018/02/13
4K0
Livy:基于Apache Spark的REST服务
基于spring-boot的rest微服务框架
周末在家研究spring-boot,参考github上的一些开源项目,整了一个rest微服务框架,取之于民,用之于民,在github上开源了,地址如下:
菩提树下的杨过
2018/09/20
8040
Ajax的异步请求探究
在开发中经常使用ajax去请求接口,而ajax不是一项新的技术,基于原生的XmlHttpRequest对象和html css js共同完成 在了解ajax之前先搞清楚什么是http, 想要了解更多可访问mozllia(霸王龙)的 https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest/send# Http
用户9347382
2022/01/10
8650
Rest API请求管理最佳实践:RestClient-cpp库的应用案例
在当今互联网时代,REST(Representational State Transfer)API已经成为了现代应用程序开发的重要组成部分。随着各种网络服务和应用程序的不断涌现,有效地管理和调用REST API变得至关重要。为了解决这一需求,开发人员们倾向于寻找可靠且易于使用的库来简化REST API请求的处理。
小白学大数据
2024/03/29
2930
AsyncContext异步请求的用法
在Servlet 3.0中,在ServletRequest上提供了startAsync()方法
全菜工程师小辉
2019/09/16
5.4K0
AsyncContext异步请求的用法
HarmonyOS 开发实践 —— 基于@ohos/axios的网络请求能力
Axios 是一个基于promise的网络请求库,可以运行node.js和浏览器中。基于Axios原库v1.3.4GitHub版本进行适配,使其可以运行在OpenHarmony并沿用其现有用法和特性。
小帅聊鸿蒙
2024/12/03
3110
HarmonyOS 开发实践 —— 基于@ohos/axios的网络请求能力
HarmonyOS 开发实践 —— 基于rcp的网络请求能力
rcp模块提供HTTP数据请求功能,请求性能如接口的易用性、性能、功耗方面,对比Network Kit HTTP网络API,rcp采用面向对象和场景的设计,API使用更简单、更灵活,满足不同场景的使用需求,具备更好的扩展性和更优的性能。支持如场景化网络API、网络代理、自定义DNS解析、自定义证书校验、服务器身份校验等特性。
小帅聊鸿蒙
2024/11/22
2220
HarmonyOS 开发实践 —— 基于rcp的网络请求能力
Angular 实践:如何优雅地发起和处理请求
Tips: 本文实现重度依赖 ObservableInput,灵感来自同事 @Mengqi Zhang 实现的 asyncData 指令,但之前没有 ObservableInput 的装饰器,处理响应 Input 变更相对麻烦一些,所以这里使用 ObservableInput 重新实现。
灵雀云
2020/02/26
8680
Angular 实践:如何优雅地发起和处理请求
Netflix 微服务异步迁移:从同步的“请求响应”模式转换为异步事件
假设我们正在运行一个基于 Web 的服务。请求处理变慢最终将会导致服务不可用。实际上,并不是所有的请求都需要立即处理。有些请求只要确认已收到即可。你有没有问过自己这样的问题:“我是否能够从异步请求处理中获益?如果确实如此的话,我该如何在一个实时的、大规模的关键任务系统中做出这种转变?”
深度学习与Python
2022/11/28
7870
Netflix 微服务异步迁移:从同步的“请求响应”模式转换为异步事件
Livy,基于Apache Spark的开源REST服务,加入Cloudera Labs
Hadoop生态圈的Spark(https://www.cloudera.com/products/open-source/apache-hadoop/apache-spark.html),一夜之间成为默认的数据处理引擎,并被作为高级分析的标准。但是它依旧有许多东西需要完善,特别是在大规模/多租户,开发与投产,以及可扩展性方面。
Fayson
2018/03/29
2.4K0
基于zookeeper的微服务实践
微服务的话题也火了好几年了,各类微服务架构的文章也是非常的多,这里也阐述下个人对微服务系统的见解。
DifficultWork
2019/06/03
1.2K0
Spring Boot快速开发REST服务实践
REST代表Representational State Transfer. 是一种架构风格,设计风格而不是标准,可用于设计Web服务,可以从各种客户端使用.
用户5224393
2019/08/30
8250
Spring Boot快速开发REST服务实践
基于 Docker 的微服务架构实践
基于 Docker 的容器技术是在2015年的时候开始接触的,两年多的时间,作为一名 Docker 的 DevOps,也见证了 Docker 的技术体系的快速发展。本文主要是结合在公司搭建的微服务架构的实践过程,做一个简单的总结。希望给在创业初期探索如何布局服务架构体系的 DevOps,或者想初步了解企业级架构的同学们一些参考。
烂猪皮
2018/08/03
2.6K0
基于 Docker 的微服务架构实践
Java调用外部REST请求的几种方式
1、RestOperations 提供了各种封装方法,非常方便直接将返回转成实体类。
伍六七AI编程
2022/03/23
8130
python-异步IO编程-异步HTTP请求的实现
在传统的同步IO编程中,当我们发起一个HTTP请求时,我们需要等待服务器返回响应,这样就会阻塞当前线程的执行。如果需要发起多个HTTP请求,就需要创建多个线程或进程来处理这些请求,这样会造成资源浪费和性能下降。为了解决这个问题,Python提供了异步IO编程模型,可以实现异步HTTP请求,从而提高程序的性能和并发能力。
玖叁叁
2023/04/21
7330
Spring 3.0支持基于rest的Web服务学习总结
尽管RESTful功能被添加到Spring MVC框架非常早期通过注释和其他API功能,支持基于rest的Web服务是Spring MVC有点晚。几个jax - rs(RESTful Web服务的Java API)实现,比如Restlet RESTEasy和球衣支持rest风格的Web服务,但Spring社区没有添加到Spring 3.0支持rest风格的Web服务功能。在这篇文章中,我讨论了Spring 3.0支持开发RESTful Web服务,检查类和注释。 快速复习,RESTful Web服务的Web
用户1289394
2018/02/27
1.3K0
小白需懂的异步请求的处理
在我们传统的服务中,当一个HTTP请求过来时,tomcat或者是其他的中间件都会有一个主线程来处理请求,所有的业务逻辑都会在这个线程里面处理完,最后会给出一个响应。由于我们的tomcat所管理的线程数是有限的,当线程到达一定程度后,再有请求过来将会无法去处理了。
用户7386338
2020/05/29
2.1K0
servlet异步请求
其中第二步处理业务逻辑时候很可以碰到比较耗时的任务,此时servlet主线程会阻塞等待完成业务处理,对于并发比较大的请求可能会产生性能瓶颈,则servlet3.0之后再此处做了调整,引入了异步的概念。
全栈程序员站长
2022/09/18
9130
servlet异步请求
ajax发送异步请求四个步骤,AJAX的异步请求的四个步骤[通俗易懂]
全部的现代浏览器均支持XMLHttpRrquest对象(IE5和IE6使用ActiveObject)async
全栈程序员站长
2022/08/29
1.4K0
Spring 异步请求
With the above in mind, the following is the sequence of events for async request processing with a Callable:
数媒派
2022/12/01
8110

相似问题

是否有可能将类似Lisp的宏构建为命令式语言?

34

是否有可能从eclipse构建过程中获得确切的maven命令?

14

是否有可能对无序元素进行响应式设计?

10

是否有可能脱离基于条件执行的bash命令?

12

是否有可能成功地包装退出方法?

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文