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