草庐IT

C# 客户端-服务器协议(protocol)/模型问题

coder 2023-09-18 原文

我正在尝试从概念上研究我用 c#(客户端和服务器)编写的客户端-服务器套接字应用程序的模型。我的服务器需要同时处理多个客户端,最好是同时处理一个客户端的多个请求。我已经为我的通信制定了一个容器,我将在每条消息的开头发送一个固定长度的 header ,其中将包含(除其他外)消息的长度。我有一些使用 c# 进行套接字编程的经验,所以我很乐意使用异步套接字。

从概念上讲,我遇到的主要问题是我需要客户端和服务器都能够随时接收消息。客户端将建立一个连接,并保持“登录状态”(就像一个 IM 客户端),它需要在任意时间接收数据并在任意时间发出请求。作为协议(protocol)的一部分,我还希望接收对每个请求的响应(无论是从服务器到客户端,还是从客户端到服务器)。

如果可能的话,我希望能够使用单个套接字。我相信我可以使用两个套接字完成这项工作,一个用于发出服务器-> 客户端请求,一个用于客户端-> 服务器请求,但我不希望处理两个端口/连接的额外复杂性。但是,使用单个套接字时,我不确定如何管理发送请求和获取响应(当它们可以交错时)。

我在搜索中找不到任何类似服务器或客户端的示例。感谢任何提供任何想法的人。

最佳答案

套接字是双向的。您只需要一个套接字即可在两个端点之间来回发送数据。但是在客户端上,您可能需要让一个线程不断地从套接字中读取数据并通知某个组件或将其接收到的数据排队,以便在其他地方进行处理,而另一个线程则通过同一个套接字发送数据。这样您就可以进行异步通信。

但是在服务器端,您需要打开一个 ServerSocket,它将绑定(bind)到一个 TCP 端口并接受该端口上的连接;您接受的每个连接都是一个新的套接字。所以每个客户端都有一个套接字,每个客户端可能需要一个线程。

您需要为将要通过套接字传递的消息建立一个协议(protocol)。您可以制定自己的协议(protocol)或查找协议(protocol),具体取决于您想要做什么。通常你会先发送两个或四个字节的长度作为消息的其余部分,这样另一方就知道要从流中读取那么多的字节;那是一条信息。消息的开头通常是消息类型;在一个非常简单的场景中,你可以说“1”是客户端请求,“2”是服务器响应,“3”是客户端回显,“4”是服务器回显响应,“5”是服务器echo,“6”是客户端回显响应等。例如,通过这种方式,您会收到一条消息,解析它,然后您知道它是来自客户端的请求还是对从服务器发送的消息的响应。

关于C# 客户端-服务器协议(protocol)/模型问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/885157/

有关C# 客户端-服务器协议(protocol)/模型问题的更多相关文章

  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-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. 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..

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  7. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  8. 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

  9. 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

  10. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

随机推荐