SOCKET通讯,第一次可以和服务器进行正常连接和数据交互,但是当关闭客户端,再次连接服务器时一直连接不上。大侠们救救我啊!!!

icerain911 2008-11-18 10:25:49
服务器端开发语言:VB.NET
客户端卡发语言:C语言[嵌入式]
当我第一启动服务器和客户端的时候,客户端发过来的数据可以正常的取得,并且可以把结果返回给客户端,但是当我把客户端关闭,再一次去连接服务器的时候,却怎么也连接不上,为什么呢。
但是当我把服务器和客户端同时关闭再开启的时候,就又可以进行正常通讯了。
服务器端代码如下:

Public Class Remote_Check
' 变数定义
Public Shared allDone As ManualResetEvent
Private Shared listenerTcp As Socket
Private th As Threading.Thread
Private th1 As Threading.Thread

'
'函数名: Initialize
'
'函数说明: 画面初期设定
'
'参数: 无
'
'返回值: 无
'
'备考:
'
Private Sub Initialize()
End Sub

'
'函数名: Start
'
'函数说明: 部品检证系统启动
'
'参数: 无
'
'返回值: 无
'
'备考:
'
Public Sub Start()
Try
' SOCKET通信开始
th = New Thread(New ThreadStart(AddressOf Main))
th.Start()
' MAIL送信
th1 = New Thread(New ThreadStart(AddressOf SendMail))
th1.Start()
Catch ex As Exception
Me.Close()
' 错误信息出力,警告错误表示
PageControlUtil.ShowErrorMsgBox("WREC998", ex.Message, MsgBoxStyle.OKOnly, "WREC996", Define.LogType.ErrorLog)
End Try
End Sub

'
'函数名: Close
'
'函数说明: 部品检证系统停止
'
'参数: 无
'
'返回值: 无
'
'备考:
'
Public Sub Close()
Try
' 线程停止
If th.IsAlive Then
th.Abort()
End If
If th1.IsAlive Then
th1.Abort()
End If
' SOCKET通信结束
If Not listenerTcp Is Nothing Then
'listenerTcp.Shutdown(SocketShutdown.Both)
listenerTcp.Close()
End If
If Not allDone Is Nothing Then
allDone.Close()
End If
Catch ex As Exception
Throw ex
End Try
End Sub

'
'函数名: Main
'
'函数说明: SOCKET连接建立
'
'参数: 无
'
'返回值: 无
'
'备考: 无
'
Public Shared Sub Main()
Try
allDone = New ManualResetEvent(False)
' 读入数据流
Dim bytes() As Byte = New [Byte](1023) {}

' 本地信息取得
Dim ipHostInfo As IPHostEntry = Dns.Resolve(Dns.GetHostName())
Dim ipAddress As IPAddress = ipHostInfo.AddressList(0)
Dim localEndPoint As New IPEndPoint(ipAddress, CInt(FunctionUtil.getConfig("BarCodePort")))

' TCP/IP协议创建
listenerTcp = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

' SOCKET绑定
listenerTcp.Bind(localEndPoint)
listenerTcp.Listen(100)

While True
Application.DoEvents()
allDone.Reset()
' 数据接受开始
listenerTcp.BeginAccept(New AsyncCallback(AddressOf AcceptCallback), listenerTcp)
' 数据出力完成前,其他的线程处于等待状态
allDone.WaitOne()
End While
Catch ex As Exception
Throw ex
End Try
End Sub

'
'函数名: SendMail
'
'函数说明: MAIL送信
'
'参数: 无
'
'返回值: 无
'
'备考: 无
'
Public Sub SendMail()
Try
While True
GetAndCheckInformation.SendMail()
th1.Sleep(10000)
End While
Catch ex As Exception
Throw ex
End Try
End Sub

'
'函数名: AcceptCallback
'
'函数说明: 数据接收,初始化
'
'参数: ARG1 - ar
'
'返回值: 无
'
'备考: 无
'
Public Shared Sub AcceptCallback(ByVal ar As IAsyncResult)
Try
Dim listener As Socket = CType(ar.AsyncState, Socket)
Dim handler As Socket = listener.EndAccept(ar)
Dim state As New StateObject
' 初始化
state.workSocket = handler
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
Catch ex As Exception
Throw ex
End Try
End Sub

'
'函数名: ReadCallback
'
'函数说明: 数据接收
'
'参数: ARG1 - ar
'
'返回值: 无
'
'备考: 无
'
Public Shared Sub ReadCallback(ByVal ar As IAsyncResult)
Dim state As StateObject = CType(ar.AsyncState, StateObject)
Dim handler As Socket = state.workSocket
Try
Dim content As String = String.Empty
Dim bytesRead As Integer = handler.EndReceive(ar)
Dim strSend As String = String.Empty

If bytesRead > 0 Then
' 数据取得
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead))
content = state.sb.ToString()
' 数据结束判定
If content.IndexOf("<EOF>") > -1 Then
' 读入信息用户的场合
If content.StartsWith("U") Then
strSend = GetAndCheckInformation.checkUserInformation(content)
End If

' 读入信息机种的场合
If content.StartsWith("Z") Then
strSend = GetAndCheckInformation.checkModelInformation(content)
End If

' 部品检证的场合
If content.StartsWith("P") Then
strSend = GetAndCheckInformation.checkModelAndFenceInformation(content)
End If

' 读入信息管理员密码输入时
If content.StartsWith("W") Then
strSend = GetAndCheckInformation.checkPassWordInformation(content)
End If

' 数据回显到客户端
Send(handler, strSend)
Else
' 数据取得
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, New AsyncCallback(AddressOf ReadCallback), state)
End If
End If
Catch ex As Exception
' 数据回显到客户端
Send(handler, "Error" + vbCr)
Throw ex
End Try
End Sub

'
'函数名: Send
'
'函数说明: 数据客户端返回
'
'参数: ARG1 - handler
' ARG2 - data
'
'返回值: 无
'
'备考: 无
'
Private Shared Sub Send(ByVal handler As Socket, ByVal data As String)
Try
Dim byteData As Byte() = Encoding.ASCII.GetBytes(data)
' 数据返回
handler.BeginSend(byteData, 0, byteData.Length, 0, New AsyncCallback(AddressOf SendCallback), handler)
Catch ex As Exception
Throw ex
End Try
End Sub

'
'函数名: SendCallback
'
'函数说明: 数据客户端返回
'
'参数: ARG1 - ar
'
'返回值: 无
'
'备考: 无
'
Private Shared Sub SendCallback(ByVal ar As IAsyncResult)
Try
Dim handler As Socket = CType(ar.AsyncState, Socket)
' 数据输送到客户端
Thread.Sleep(300)
Dim bytesSent As Integer = handler.EndSend(ar)
handler.Shutdown(SocketShutdown.Both)
handler.Close()
allDone.Set()
Catch ex As Exception
Throw ex
End Try
End Sub
End Class
...全文
454 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gongsun 2008-11-19
  • 打赏
  • 举报
回复
晕,你这个东西也太多了。
shily_fly 2008-11-19
  • 打赏
  • 举报
回复
太高级了吧,没听过,还是支持。。。
icerain911 2008-11-19
  • 打赏
  • 举报
回复
接着ding
icerain911 2008-11-19
  • 打赏
  • 举报
回复
没有人能解决么,自己ding
baobaoxiong_840123 2008-11-18
  • 打赏
  • 举报
回复
友情up
icerain911 2008-11-18
  • 打赏
  • 举报
回复
不好意思啊,怎么看服务器端的端口是否还开着,使用telnet来看么。
如果是开着的那我该怎么办呢。
客户端是30台无线接收器在同时使用,其中一台关闭的话,其他的也要
保证正常工作才行的啊,不可能强制关闭端口吧。
skey111 2008-11-18
  • 打赏
  • 举报
回复
你关闭客户端的时候,你再看看服务器端的端口是否还开着,

内容概要:本文围绕基于元模型优化算法的主从博弈多虚拟电厂动态定价与能量管理展开研究,提出了一种结合主从博弈框架与元模型优化算法的协同优化方法。通过构建多虚拟电厂之间的主从博弈模型,刻画其在电力市场中的交互行为与利益分配机制,并引入元模型(如代理模型、响应面模型)对复杂优化问题进行近似求解,显著提升了计算效率与求解精度。该方法能够有效处理含不确定性因素的动态定价、负荷调度与能量管理问题,在保障系统运行稳定性的基础上,实现经济性与可靠性的协同优化。研究还提供了完整的Matlab代码实现路径与仿真结果,验证了所提方法在多主体协同决策与资源优化配置方面的有效性与实用性。; 适合人群:具备一定电力系统、博弈论基础及Matlab编程能力,从事能源互联网、综合能源系统、电力市场机制设计等相关领域研究的科研人员与研究生。; 使用场景及目标:①用于多虚拟电厂参与电力市场的动态定价机制设计与博弈行为建模;②实现考虑可再生能源不确定性的分布式能源系统协同优化调度;③为多主体能源系统的市场出清、收益分配与策略性投标提供算法支撑与仿真平台。; 阅读建议:建议读者结合所提供的Matlab代码深入理解主从博弈的数学建模过程与元模型优化算法的具体实现细节,重点关注目标函数构造、约束处理及算法收敛性分析,并可进一步拓展至其他智能优化算法或多场景鲁棒性对比研究,以深化对复杂能源系统决策机制的理解。
内容概要:本文详细介绍了用于无速度传感器交流电机驱动的扩展卡尔曼滤波器(EKF)的Matlab代码实现与Simulink仿真实现方法。该技术通过EKF算法对交流电机的转速和转子位置进行精确估计,克服了传统依赖速度传感器带来的成本高、易故障等问题,适用于高性能、高可靠性的电机控制系统。文中系统阐述了交流电机的非线性数学建模过程,构建了相应的状态空间方程与观测方程,明确了过程噪声与测量噪声的协方差矩阵设定方法,并深入探讨了滤波器初始参数的选择与整定策略。通过Simulink搭建完整的闭环控制系统仿真模型,验证了EKF在动态响应、抗干扰能力和稳态精度方面的优异性能,证明了其在无传感器矢量控制中的有效性和鲁棒性。该研究为现代电机驱动系统的低成本、高集成度设计提供了重要的理论依据和技术支持。; 适合人群:具备一定电机控制理论基础和Matlab/Simulink仿真能力的电气工程、自动化、控制科学与工程等相关专业的高年级本科生、研究生、科研人员及从事电机驱动系统开发的工程技术人员。; 使用场景及目标:①应用于无速度传感器的感应电机或永磁同步电机控制系统的设计与性能优化;②作为高等院校“现代控制理论”、“电机控制”、“电力电子与电力传动”等课程的教学案例或课程设计、毕业设计的技术参考;③帮助研究人员深入理解EKF在非线性系统状态估计中的应用机理,掌握其在工程实践中建模、仿真与参数调试的核心方法,进而提升复杂机电系统智能控制的研发能力。; 阅读建议:建议读者结合提供的Matlab代码与Simulink模型进行同步学习与仿真操作,重点关注EKF算法模块的实现细节、系统状态变量的选取逻辑以及噪声参数对滤波效果的影响。在学习过程中,应尝试改变电机负载、转速指令或引入测量噪声等不同工况,观察并分析EKF的估计性能变化,以深刻理解其动态响应特性和鲁棒性,从而真正掌握该先进状态估计算法的工程应用精髓。
内容概要:本文研究了基于开关电容器的级联多电平逆变器,采用布尔PWM控制技术进行系统控制,并通过Simulink平台完成了完整的仿真验证。该方案结合开关电容器电路结构,能够在减少功率器件数量的同增加输出电平数,有效降低输出电压谐波含量,提升系统效率、功率密度及电压均衡能力。布尔PWM控制策略基于逻辑运算生成高效开关信号,相较于传统调制方法,具有算法简洁、实性强、可靠性高的优点,尤其适用于高电平数、高集成度的多电平逆变系统。文章详细阐述了系统拓扑结构、工作模态分析、开关电容电压自平衡机制、布尔逻辑调制算法设计及仿真模型搭建过程,仿真结果验证了该方案在改善输出波形质量、抑制器件电压应力、实现电容电压自然平衡方面的优越性能。; 适合人群:电力电子、电气工程及其自动化等相关专业的硕士/博士研究生、高校科研人员以及从事新能源发电、电机驱动、柔性输配电等领域产品研发的工程技术人员。; 使用场景及目标:①应用于太阳能光伏逆变、风力发电并网、电动汽车电机驱动等对电能质量要求较高的场合;②为高效率、高可靠性、模块化多电平逆变器的设计提供新思路;③推动布尔逻辑控制等数字化调制技术在电力电子变换器中的创新应用;④作为教学与科研中先进逆变技术的仿真案例参考。; 阅读建议:建议读者具备电力电子变换器拓扑与PWM调制技术的基础知识,结合Simulink仿真模型深入理解布尔PWM的逻辑生成机制及其与开关电容拓扑的协同工作原理,重点关注调制策略如何实现多电平输出与电压自平衡的耦合控制。

62,269

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧