.net中的socket异步通信实现--服务器端代码


项目的需求是这样的:
1.需要能够实现多个工作站互相进行异步数据传输
2.能够根据不同工作站的配置情况选择从哪个工作站申请数据
3.能够及时收获各工作站的配置变更和在线情况
4.收到的数据信息量较大,需要进行处理后送到其他模块备用。
根据这些需求让我觉得我要做的这部分程序有点像QQ的功能,因此我需要在服务器端程序建立一个服务程序。
各工作站通过服务程序获得其他工作站的在线列表和每个工作站的配置信息,所有工作站的配置一旦更新,全部上传到服务器端保留。

.net中的socket异步通信实现Imports System.ServiceProcess
.net中的socket异步通信实现Imports System.Net.Sockets
.net中的socket异步通信实现Imports System.Net
.net中的socket异步通信实现Imports System.Threading
.net中的socket异步通信实现Imports System.Collections
.net中的socket异步通信实现Imports System.Text
.net中的socket异步通信实现Imports System.IO
.net中的socket异步通信实现
.net中的socket异步通信实现Public Class Server
.net中的socket异步通信实现    Inherits System.ServiceProcess.ServiceBase
.net中的socket异步通信实现
.net中的socket异步通信实现#Region 
"全局变量"
.net中的socket异步通信实现    Dim ServerSocket As New Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp)
.net中的socket异步通信实现    Dim ipep As IPEndPoint 
= New IPEndPoint(IPAddress.Any, 11000)
.net中的socket异步通信实现    Dim htUserList As New Hashtable  
'用来保存在线用户和用户的"IP和端口" 
.net中的socket异步通信实现
    Dim userName(0) As String
.net中的socket异步通信实现    Dim userIPEP(
0) As IPEndPoint
.net中的socket异步通信实现    Dim userTime(
0) As Integer
.net中的socket异步通信实现    Dim DataServerInfor(
0) As String
.net中的socket异步通信实现    Dim DataServerSaveEnd(
0) As Boolean
.net中的socket异步通信实现    Dim timerDelegate As New TimerCallback(AddressOf onLineTimeOut)
.net中的socket异步通信实现    Dim sw As StreamWriter
.net中的socket异步通信实现    Dim movelenth As Integer 
= 512 '最大为512,乘以2为传送的最大字节数:1024
.net中的socket异步通信实现
    Private Shared LongSendID As Integer = 0
.net中的socket异步通信实现    Private LongSendMax As Integer 
= 50
.net中的socket异步通信实现    Private dealing As Boolean 
= False
.net中的socket异步通信实现    Private ReceiveDataList As DataQueue
.net中的socket异步通信实现#End Region
.net中的socket异步通信实现
.net中的socket异步通信实现#Region 
"参数"
.net中的socket异步通信实现
.net中的socket异步通信实现    
'以下是客户端到服务器端的消息开头 
.net中的socket异步通信实现
    Const LOGININ As String = "10" '请求登陆的消息|||消息形式:10+自己的用户名 
.net中的socket异步通信实现
    Const LOGINOUT As String = "11" '请求登出的消息|||消息形式:11+自己的用户名 
.net中的socket异步通信实现
    Const GETULIST As String = "12" '请求获得在线用户列表|||消息形式:12 
.net中的socket异步通信实现
    Const P2PCONN As String = "13" '请求P2P连接的消息|||消息形式:13+自己的用户名+|+对方的用户名 
.net中的socket异步通信实现
    Const HOLDLINE As String = "14" '保持连接.|||消息开式:14+自己的用户名 
.net中的socket异步通信实现

.net中的socket异步通信实现    
'以下是服务器到客户端的消息开头 
.net中的socket异步通信实现
    Const HVUSER As String = "20" '用户名已存在 
.net中的socket异步通信实现
    Const GETUSER As String = "21" '在线用户列表|||消息格式:21+用户名+EP 
.net中的socket异步通信实现
    Const MAKHOLD As String = "22" '打洞命令|||消息格式:22+IP 
.net中的socket异步通信实现
    Const LOGINOK As String = "23" '登陆成功 
.net中的socket异步通信实现
    Const SERVCLS As String = "24" '服务器关闭 
.net中的socket异步通信实现
    Const MSGEND As String = "25" '消息结束 
.net中的socket异步通信实现
    Const ONEOFF As String = "26" '一个客户端下线
.net中的socket异步通信实现

.net中的socket异步通信实现    
'以下是服务器端的命名 
.net中的socket异步通信实现
    Const EXITPRO As String = "EXIT" '退出命令 
.net中的socket异步通信实现
    Const SHOWULIST As String = "SHOWUSER" '显示在线用户 
.net中的socket异步通信实现
    Const HELP As String = "HELP" '显示帮助 
.net中的socket异步通信实现

.net中的socket异步通信实现    
'以下是工作站发送给服务器的消息开头:
.net中的socket异步通信实现
    Const RECDEVINFO As String = "45" '工作站发送给服务器的设备配置信息
.net中的socket异步通信实现

.net中的socket异步通信实现    
'以下是ICU客户端发送给本服务器程序的命令:
.net中的socket异步通信实现
    Const GETDATASERVER As String = "50"        '获取当前在线的数据服务器(即工作站)
.net中的socket异步通信实现
    Const SHOWDATASERVER As String = "51"       '将在线的数据服务器
.net中的socket异步通信实现
    Const GETDSERVERINFOR As String = "52"      '获取某个数据服务器的配置信息
.net中的socket异步通信实现

.net中的socket异步通信实现#End Region
.net中的socket异步通信实现
.net中的socket异步通信实现#Region 
" 组件设计器生成的代码 "
.net中的socket异步通信实现
.net中的socket异步通信实现    Public Sub New()
.net中的socket异步通信实现        MyBase.New()
.net中的socket异步通信实现
.net中的socket异步通信实现        
' 该调用是组件设计器所必需的。
.net中的socket异步通信实现
        InitializeComponent()
.net中的socket异步通信实现
.net中的socket异步通信实现        
' 在 InitializeComponent() 调用之后添加任何初始化
.net中的socket异步通信实现

.net中的socket异步通信实现    End Sub
.net中的socket异步通信实现
.net中的socket异步通信实现    
'UserService 重写 dispose 以清理组件列表。
.net中的socket异步通信实现
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
.net中的socket异步通信实现        If disposing Then
.net中的socket异步通信实现            If Not (components Is Nothing) Then
.net中的socket异步通信实现                components.Dispose()
.net中的socket异步通信实现            End If
.net中的socket异步通信实现        End If
.net中的socket异步通信实现        MyBase.Dispose(disposing)
.net中的socket异步通信实现    End Sub
.net中的socket异步通信实现
.net中的socket异步通信实现    
' 进程的主入口点
.net中的socket异步通信实现
    <MTAThread()> _
.net中的socket异步通信实现    Shared Sub Main()
.net中的socket异步通信实现        Dim ServicesToRun() As System.ServiceProcess.ServiceBase
.net中的socket异步通信实现
.net中的socket异步通信实现        
' 在同一进程中可以运行不止一个 NT 服务。若要将
.net中的socket异步通信实现
        ' 另一个服务添加到此进程,请更改下行以
.net中的socket异步通信实现
        ' 创建另一个服务对象。例如,
.net中的socket异步通信实现
        '
.net中的socket异步通信实现
        '   ServicesToRun = New System.ServiceProcess.ServiceBase () {New Service1, New MySecondUserService}
.net中的socket异步通信实现
        '

在上一篇文章中主要介绍了socket异步通信实现的服务器端代码,下面我们来分析一下客户端代码:
那么在设计客户端代码时我们主要考虑哪些问题呢?
第一是如何接收数据,往往一次传输的数据量较大,但socket一次的传输量是1024个byte,因此需要对数据在发送端进行拆分,而在接收端进行组合。
第二是需要建立缓冲区,网络传输的速度肯定比我们处理数据的速度快。
大家如果需要使用这段代码,需要编写一下其中的ClassSetup类,该类包含每个工作站的配置信息,由于版权问题,在这里就不公开了。
客户端代码如下:


End Class

相关文章: