草庐IT

c# - 数据已经发送后服务器不发送数据

coder 2023-09-19 原文

我正在做一个项目,我需要向服务器发送请求,然后让服务器根据请求(JSON 格式)回复数据,它有点工作,除了在第一次回复之后它没有'不要再回复了,我用的是SimpleTcp对于客户端和服务器。 (我不确定是服务器没有发送回复,还是客户端只是不接受,我真的不知道怎么说)

这是客户端代码:

public TType GetReply<TType>()
    { 
        var requestJson = this.ToJson(); // 'this' is the request class which holds the request information and data
        var reply = Client.client.WriteLineAndGetReply(requestJson, TimeSpan.FromSeconds(10));

        while (reply == null)
        {
            Debug.WriteLine("Waiting for not null");
        }

        while (string.IsNullOrEmpty(reply.MessageString))
        {
            Debug.WriteLine("WAITING");
        }
        var str = reply.MessageString.Substring(0, reply.MessageString.Length - 1); // SimpleTcp adds a delimiter by default, this is to remove it
        Debug.WriteLine("JSON: " + str);
        var data = (JObject)JsonConvert.DeserializeObject<RequestReply>(str).RequestedData;

        return data.ToObject<TType>();
    }

这是服务器代码:

static void HandleIncomingData(Message e)
    {
        string reply = "";
        var formattedData = e.MessageString.Substring(0, e.MessageString.Length - 1); // SimpleTcp adds a delimiter by default, this is to remove it
        var data = JsonConvert.DeserializeObject<Request>(formattedData);

        Console.WriteLine(formattedData);
        Console.WriteLine($"'{data.RequestValues["request"]}' Request");

        switch (data.RequestValues["request"].ToString())
        {
            default:
                reply = CommandHandler.HandleDBRequest(data.RequestValues).ToJson();
                break;

            case "EnterRoom":
                server.ConnectedUsers.Add(new ConnectedUser(e.TcpClient, (int)(long)data.RequestValues["id"]));
                Console.WriteLine($"Client Connected in Room [{data.RequestValues["id"]}] || {e.TcpClient.Ip()}");
                break;  
        }

        Console.WriteLine(reply);
        Console.WriteLine(data.Reply);
        if (data.Reply) e.ReplyLine(reply); // Not sending more than 1 reply
    }

一些注意事项:

data.RequestValues 是保存请求数据的字典(例如,如果是登录请求,它将保存电子邮件和密码)

data.Reply 是一个 bool 值,用于检查服务器是否应该回复请求(我已经确认在不回复的情况下它是真的)

在某些情况下,我使用 JsonConvert 而不是 .ToJson();.FromJson(); 的原因只是为了测试目的,我忘了改回来.

抱歉,如果我泄露了任何信息,对 stackoverflow 来说是新信息。

最佳答案

您的代码是否正确处理了通信协议(protocol)?

比如服务器收到信息后,是不是在等你确认拿到数据了?

如果您正在使用 C# 构建自己的客户端和服务器,那么您可以查看我发表的一篇旧文章(2010 年 10 月 15 日),其中我使用 C 语言编写了一个客户端和一个使用 Vigenere Cipher 的服务器:http://www.acarlstein.com/?p=891

如果你看一下代码,你会看到实现了一个完整的通信协议(protocol):

#define CODE_FAIL                           '0FAIL'
#define CODE_OK                             '1OK'

#define CODE_HELLO                      '100HELLO'
#define CODE_WELCOME                    '101WELCOME'
#define CODE_REQ_SERVER_NAME    '102REQ_SERVER_NAME'

#define CODE_MSG                            '200MSG'

#define CODE_DATA                           '300DATA'
#define CODE_EOF                            '301EOF'
#define CODE_PUT                          '302PUT'
#define CODE_REQUEST_FILENAME   '303REQ_FILENAME'
#define CODE_REQUEST_ENCRYPT  '304REQ_ENCRYPT'
#define CODE_ENCRYPT                    '305ENCRYPT'
#define CODE_REQUEST_FILE     '306REQUEST_FILE'


#define CODE_CMD                            '400CMD'
#define CODE_LS                             '401LS'

#define CODE_ERROR            '500ERROR'
#define CODE_ERROR_LS                   '501ERROR_LS'
#define CODE_ERROR_CREAT_FILE '502ERROR_CREAT_FILE'

#define CODE_EXIT                           '600EXIT'

因此,如果您正在等待来自服务器的更多信息但没有收到,则意味着您应该发送一些内容来告诉服务器继续向您发送信息。

关于c# - 数据已经发送后服务器不发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51620206/

有关c# - 数据已经发送后服务器不发送数据的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  5. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  8. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  9. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  10. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

随机推荐