使用 Windows Sockets 和 TCP/IP 进行通信的类
具有许多有用属性和方法的使用 TCP/IP 进行通信的类
引言
我观察到许多开发人员在第一次使用 Sockets 时迷失了方向,特别是那些习惯于使用 Delphi 的组件通过 TCP/IP 进行通信(TServerSocket
和 TClientSocket
)的开发人员。 因此,我感到有动力创建类似于 Delphi 组件的库。
除了这两个类之外,我还开发了一个如何使用这些类的示例。 此外,这也是使用委托和事件的一个很好的例子。
背景
将类的名称更改为 CServerSocket
和 CClientSocket
。 这样(类的名称以字母 C 开头),两者都可以与 C# 相关联,C# 用于开发这些类,但它也提醒您使用“CallBack
”。 尽管有使用 Thread.Start()
方法使用 Sockets 的示例,但没有看到太多使用它的理由。 我做了一些测试,意识到使用“Callback
”而不是线程有两个优点。
- 开发更容易且更灵活
- 应用程序响应更快
经常被问到的一个问题是:“Socket 支持多少个连接?” 好吧,当一个客户端连接到服务器时,该客户端会被重定向到另一个端口,以便服务器继续在初始端口等待调用。 这意味着由于有 65535 个端口,因此套接字最多可以接收 65535 个调用。 但我们始终考虑计算机的处理能力和其他应用程序使用的端口。
由于本文的目的是展示如何使用 Sockets 的方法和属性来创建一个高效的类,因此我将专注于解释这些类的方法和属性。 将来,我可能会用对 Delegate
和 Callback
的更详细的解释来完善本文。
CClientSocket
所有方法和属性都非常直观。 因此,我想只评论一些细节。
属性 ReceivedBytes
和 ReceivedText
用作缓冲区。 因此,当读取其中一个时,其内容将被删除。 它们应与事件 OnRead
结合使用。
WriteText
属性也是如此,它返回一个通过连接传递的 string
。 它应该与事件 OnWrite
结合使用。
该类的构建器要求告知建立连接的参数 – CClientSocket(string IP, int port)
。 但是,只有通过 Connect()
方法才能建立连接。
SendFile()
方法可以选择在发送文件之前和之后是否发送消息。 这可用于创建文件传输管理器,从而创建适合通信的协议。
CServerSocket
属性 ReceivedBytes
、ReceivedText
和 WriteText
具有与另一个类相同的功能。
在实例化一个类时,需要告知该类将等待调用的端口。 使用 Active()
方法,该类开始等待调用,并触发 OnListen
事件。
使用 Deactive()
方法,该类将无法监听端口并失去所有连接。 但是,使用 CloseConnection(int SocketIndex)
方法,可以仅结束特定的连接。
其他方法非常直观。
示例
该示例也非常直观。 它是一个服务器,显示已连接客户端的一些属性,并将消息发送给特定客户端或所有客户。 它还有两个客户端。 为了使它们能够连接,您必须使用 IP 127.0.0.1 和您选择的端口。
您还可以看到如何实现这些类的事件。
您不需要使用应用程序示例的客户端。 例如,您可以使用 HyperTerminal。
服务器如何管理客户的内容? ArrayList
可以解决问题,但我使用 ComboBox
。
在示例中没有实现的方法,但非常直观的是文件的发送和接收(SendFile()
)。
问候!