本帖最后由 nmgwddj 于 2012-3-21 14:09 编辑
首先做一个简单的图给大家看一下我所设想的思路,大家帮忙看看是否有什么错误。
在经过这样设计以后,代码是下面这样写的。
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;服务端程序
#region ### START Koda GUI section ### Form=
$IpAddr = @IPAddress1
$Port = 10002
TCPStartup();开始 TCP 服务
$Socket = TCPListen($IpAddr, $Port)
$Form1 = GUICreate("Form1", 361, 265)
$Edit = GUICtrlCreateEdit("", 8, 8, 345, 217, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN, $WS_VSCROLL))
$Button1 = GUICtrlCreateButton("Exit", 280, 232, 75, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
$ConnectedSocket = -1;先初始化一下$ConnectedSocket变量
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $Button1
TCPCloseSocket($ConnectedSocket)
TCPShutdown()
Exit
EndSwitch
If $ConnectedSocket = -1 Then
$ConnectedSocket = TCPAccept($Socket)
EndIf
$sRecv = TCPRecv($ConnectedSocket, 2048, 1)
If $sRecv <> '' Then;如果接收的数据包不为空
GUICtrlSetData($Edit, BinaryToString($sRecv, 4));将客户端发送的信息写到edit框中
_SendToClient('已经收到你的消息,给你发送数据库里的信息');在已经建立的套接字上给客户机发送消息
$ConnectedSocket = -1
TCPCloseSocket($ConnectedSocket);发送过一次消息后关闭此连接。
EndIf
WEnd
Func _SendToClient($Info)
If $Info = "" Then Return
$sMsg = StringToBinary($Info, 4)
TCPSend($ConnectedSocket, $sMsg)
EndFunc ;==>_SendToClient
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#region ### START Koda GUI section ### Form=
;客户端程序
Global $sEndSocket
TCPStartup();开始 TCP 服务.
$Form2 = GUICreate("窗体1", 353, 102)
$Input1 = GUICtrlCreateInput("", 88, 72, 121, 21)
$sEnd = GUICtrlCreateButton("sEnd", 224, 72, 75, 25)
$IPAddress1 = _GUICtrlIpAddress_Create($Form2, 120, 8, 130, 21)
_GUICtrlIpAddress_Set($IPAddress1, "192.168.3.247")
$Label1 = GUICtrlCreateLabel("ServerIP:", 72, 16, 48, 17)
$Label2 = GUICtrlCreateLabel("Port:", 88, 40, 26, 17)
$Input2 = GUICtrlCreateInput("10002", 120, 40, 49, 21)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $sEnd
SendDataToServer(GUICtrlRead($Input1))
EndSwitch
$sRecv = TCPRecv($sEndSocket, 2048, 1);从SendDataToServer中已经连接的套接字上接收数据。
If $sRecv <> '' Then;如果接收的数据包不为空
MsgBox(0, '', BinaryToString($sRecv, 4))
EndIf
WEnd
Func SendDataToServer($sData)
Local $ServerIP = _GUICtrlIpAddress_Get($IPAddress1)
Local $Port = GUICtrlRead($Input2)
$sEndSocket = TCPConnect($ServerIP, $Port)
If @error Then
MsgBox(4112, "错误", "TCP连接失败,服务端未启用!错误代码: " & @error)
Else
If @error Or $sData = "" Then Return
$sMsg = StringToBinary($sData, 4)
TCPSend($sEndSocket, $sMsg)
EndIf
EndFunc ;==>SendDataToServer
上面代码大家帮忙看下是否有缺陷?现在虽然可以实现多台客户机与服务端连接。
但是在客户端每次发送一条数据的时候,都要与服务端重新建立一个新的连接(是因为服务端每次接收到消息以后都会TCPCloseSocket掉连接,为了正确连接其他机器。)。这样会不会导致服务端连接数超出?
又或者说我代码设计的有问题呢?
或者说如何让每一台客户机与服务器只单线连接进行通讯?请各位指教谢谢。 |