首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

socket短连接的服务端,无故中止运行,请

2013-09-07 
socket短连接的服务端,无故中止运行,请高手指点!以下代码,接收客户端的数据,大部份时间是正常的,但是几小

socket短连接的服务端,无故中止运行,请高手指点!
以下代码,接收客户端的数据,大部份时间是正常的,但是几小时会发生一次停止工作的情况,在测试环境,测试接收十万条数据,均正常!中止原因不明,请高手指教~~


Public Sub WaitData()

    Dim localEndPoint As New IPEndPoint(IPAddress.Parse(My.Settings.SocketSrvIP.ToString), 4444) ''指定IP和Port

    Try

        s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) ''使用TCP协议
        s.Bind(localEndPoint)    ''绑定到该Socket
        s.Listen(120)  ''侦听

        WriteLogFile(Now() + " ------------------ 正在监听 " & My.Settings.SocketSrvIP.ToString & " ------------------" & vbCrLf)

        While (True)
            Dim bytes(80) As Byte ''用来存储接收到的字节
            Dim ss As Socket = s.Accept() ''若接收到,则创建一个新的Socket与之连接
            ss.Receive(bytes)  ''接收数据,若用ss.send(Byte()),则发送数据

            WriteLogFile(Now() & " - " & "   ***** 成功建立TCP连接 (" & i & ") *****   " & vbCrLf)

            bUpdating = True

            ss.Close()
            ss = Nothing

            i = i + 1

            'Dim sMessage As String = Encoding.Unicode.GetString(bytes)
            '2013.05.21
            ''正常:srRead = New StreamReader(nsStream, System.Text.Encoding.GetEncoding("gb2312"))
            Dim sMessage As String = Encoding.GetEncoding("gb2312").GetString(bytes)

            WriteLogFile(Now() & " - 收到:[" & sMessage & "]" & vbCrLf)
            ''若使用Encoding.ASCII.GetString(bytes),则接收到的中文字符不能正常显示



            If sMessage = "" Then
                WriteLogFile(Now + " ERR:" & "格式不对,收到空值!" & vbCrLf)
            End If

            sMessage = sMessage.Substring(0, sMessage.Length - 1)
            sMessage = RTrim(sMessage) & "|"

            Dim arrMsg As String() = Split(sMessage, "|")

            If arrMsg.Length < 9 Then
                WriteLogFile(Now & " ERR:" & "格式不对,数组长度不足9位!" & vbCrLf)

            ElseIf (arrMsg(0) = "500") Then

                Dim iWt As Double = 0
                Dim sWt As String = LTrim(RTrim(arrMsg(8).ToString))
                ''Dim sWt As String = Trim(arrMsg(8).ToString.Replace(" ", ""))
                ''Dim sWt As String = Trim(arrMsg(8).ToString.Replace(" ", ""))


                Dim sSqlTmp As String = "insert into tb_sm_logistics ........"

                Call cdb.OpenDB()

                'cdb.DoUpdate(sSqlTmp)

                Call cdb.CloseDB()

                WriteLogFile(Now() & "   ******* 成功入库:" & arrMsg(1) & " *******   " & vbCrLf)

            Else


                WriteLogFile(Now() & "ERR:" & ":" + "包头格式不对!当前包头:" & arrMsg(0) & vbCrLf)

            End If

            bUpdating = False

            '最后建立连接时间
            dLastDt = Now()

        End While

    Catch ex As Exception

        WriteLogFile("Waiting ERR:" & ex.ToString & vbCrLf)


    Finally

        bUpdating = False

    End Try
End Sub socket
[解决办法]
代码太多,你也没有什么调试诊断信息,懒得看这么多代码。随便说几点:

1. 你写了s.Listen(120) ,我不知大从哪里抄的。在.net框架中封装了非常好的 TcpListener类,专门做 TCP 服务器用的,而且它默认地就使用 IOCP 机制等等,用不着你再去写什么代码。关键是人家的 Listen参数是多少?是 int.MaxValue,我相信这是在测试上完全可行的参数值!我不知道你为什么写为120,好像是跟微软工程师的想法大相径庭。我知道网上一些所谓“培训班的老师”写的博客经常把这个参数写为10。你为什么不看看微软的呢?

2. 你的程序如果作为一个例子去学习基本的几天语句,可以。如果作为服务器程序,效率低的没法接受。阻塞,并且耗时的(包括会引起底层数据拥塞和出错的文件操作等等)所有操作都在一个线程里执行,这是不能接受的。

热点排行