找回密码
 加入
搜索
查看: 7454|回复: 11

[网络通信] 【已解决】服务端向客服端发送信息失败

  [复制链接]
发表于 2012-9-30 23:19:47 | 显示全部楼层 |阅读模式
本帖最后由 xg911335 于 2012-10-5 17:42 编辑

服务端:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>
#Region ### START Koda GUI section ### Form=
Global $ipadd="127.0.0.1",$port=10008,$MainSocket,$ConnectedSocket,$rAccept,$simage,$recv
TCPStartup ( )
$MainSocket = TCPListen($ipadd,$port,100)
If $MainSocket = -1 Then Exit
$Form1 = GUICreate("Form1", 515, 520, 192, 124)
$ListView1 = GUICtrlCreateListView("t1|t2|t3|t4|t5", 0, 0, 514, 454)
_GUICtrlListView_SetColumnWidth($ListView1, 0, 50)
GUICtrlSendMsg($ListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
$listMenu = GUICtrlCreateContextMenu($ListView1)
$send = GUICtrlCreateMenuItem("send", $listMenu)
$Button1 = GUICtrlCreateButton("Button1", 16, 472, 75, 25)
$Button2 = GUICtrlCreateButton("Button2", 120, 472, 75, 25)
GUISetState(@SW_SHOW)
;connserver()
#EndRegion ### END Koda GUI section ###
While 1
_accept()
Switch GUIGetMsg()
  Case $GUI_EVENT_CLOSE
   Exit
  Case $Button1
  Case $send
   TCPStartup()
   $ConnectedSocket = TCPConnect ("127.0.0.1",10008)
   TCPSend($ConnectedSocket,"123123")
   If @error Then MsgBox(4096,"listteam_1",TCPSend($ConnectedSocket,"123123"))
  EndSwitch
WEnd
Func _accept();尝试接受一个套接字(socket)连接
     $ConnectedSocket = TCPAccept($MainSocket)
     If $ConnectedSocket <> -1 Then
      MsgBox(4096,"","我的服务器 - 客户端已连接")
   $recv = TCPRecv($ConnectedSocket,2*2048)
   If @error Then
    TCPCloseSocket($recv)
   Else 
    MsgBox(4096,"s2",$recv)
    GUICtrlCreateListViewItem($recv,$ListView1)
   EndIf
     EndIf
   EndFunc
   
   Func _recv();从已经连接的套接字里面接收数据
     $recv = TCPRecv($ConnectedSocket,2048)
     If @error Then
      TCPCloseSocket($recv)
     Else 
      MsgBox(4096,"s2",$recv)
      GUICtrlCreateListViewItem($recv,$ListView1)
     EndIf
   EndFunc
客服端:
Global $g_IP = "127.0.0.1",$Connected,$LOCALIP=@IPAddress1,$str="1111111"
TCPStartup ( )
$Connected = TCPConnect($g_IP,10008)
If @error Then
        MsgBox(4112, "错误", "TCP连接失败,服务端未启用!错误代码: " & @error)
    Else
  TCPSend($Connected,"Online|"&@ComputerName&"|"&$LOCALIP&"|"&$str)
    EndIf

While 1 ;循环接收服务器指令
;Sleep(900)
$test=TCPRecv($Connected,2048)
If $test <> "" Then
  ;Writelog("信息","接收到服务端命令:"&$command)
  MsgBox(4096,"client",$test)
EndIf
WEnd
客户端发送到服务端信息能收到,但服务端的Case $send的内容无法发送信息到客户端,好像是无法建立连接,麻烦高手帮我看看?
发表于 2012-10-1 10:27:10 | 显示全部楼层
服务端代码第31行 $ConnectedSocket = TCPConnect ("127.0.0.1",10008),是重新建立了一个套接字,可客户端没有侦听端口, 如何能成功。
要么利用客户端主动与服务端建立的原套接字进行发送,要么客户端也侦听一个端口,在这基础上再建立套接字进行通信。
 楼主| 发表于 2012-10-1 13:14:23 | 显示全部楼层
While 1
_accept()
Switch GUIGetMsg()
  Case $GUI_EVENT_CLOSE
   Exit
  Case $Button1
  Case $send
   TCPStartup()
   TCPSend($ConnectedSocket,"123123") 修改成这样也不能发送。。。。。。????
  EndSwitch
_accept()
_recv()
TCPSend($ConnectedSocket,"123123") 放到这里却能发送
WEnd
发表于 2012-10-1 20:51:57 | 显示全部楼层
稍改了一下,供参考
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>

Global $MainSocket, $rAccept, $simage, $recv
Global $ipadd = "127.0.0.1", $port = 10008
Global $ConnectedSocket = -1
TCPStartup()
$MainSocket = TCPListen($ipadd, $port, 100)
If $MainSocket = -1 Then Exit

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 515, 520, 192, 124)
$ListView1 = GUICtrlCreateListView("t1|t2|t3|t4|t5", 0, 0, 514, 454)
_GUICtrlListView_SetColumnWidth($ListView1, 0, 50)
GUICtrlSendMsg($ListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES)
$listMenu = GUICtrlCreateContextMenu($ListView1)
$send = GUICtrlCreateMenuItem("send", $listMenu)
$Button1 = GUICtrlCreateButton("Button1", 16, 472, 75, 25)
$Button2 = GUICtrlCreateButton("Button2", 120, 472, 75, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

Do
        $ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
MsgBox(4096, "服务器", "一个客户端连接成功")

While 1
        _recv()
        Switch GUIGetMsg()
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Button1
                Case $send
                        $nstr = TCPSend($ConnectedSocket, "123123")
                        MsgBox(4096, "服务器", "发送数据量:" & $nstr)
        EndSwitch
WEnd

Func _recv();从已经连接的套接字里面接收数据
        $recv = TCPRecv($ConnectedSocket, 2048)
        If @error Then
                MsgBox(4096, "服务器", "接收失败")
                If $ConnectedSocket <> -1 Then TCPCloseSocket($ConnectedSocket)
                TCPShutdown()
                Exit
        Else
                If $recv <> "" Then
                        MsgBox(4096, "服务器", "接收到客户端数据:" & $recv)
                        GUICtrlCreateListViewItem($recv, $ListView1)
                EndIf
        EndIf
EndFunc   ;==>_recv
发表于 2012-10-1 21:39:56 | 显示全部楼层
$nstr = TCPSend($ConnectedSocket, "123123")



把后面的端口改成四位数。。再试
 楼主| 发表于 2012-10-2 12:14:54 | 显示全部楼层
本帖最后由 xg911335 于 2012-10-2 12:19 编辑

非常感谢各位的回答,使用4楼的方法可以,但GUI会卡死,无法接受GUI消息。5楼的方法测试行不通,不过也非常感谢!

另外我还是搞清楚我自己写的代码问题处在那里,搞清楚了有助于我在以后的代码中查找问题及成长总结。更重要的是减少发帖求助,能更多地帮助出现类似问题的朋友。谢谢大家。
发表于 2012-10-2 19:29:24 | 显示全部楼层
什么时候卡?在等待客户端连接之前吗?那是这样的,因为等待连接是放在一个独立的是Do循环中了。解决这个问题可以用你一楼的代码,客户端连接功能放在_accept()函数中,此函数再放在While循环中。 只是楼主你一楼的_accept()中TCPRecv($ConnectedSocket,2*2048)语句 是似乎是多余的,因为接收数据 有_recv()自定义函数专门来完成。且第42行TCPCloseSocket($recv)中,$recv不是套接字标识符,错误。第30行TCPStartup(),重复,不应再有。3楼代码在while循环中有二个_accept()函数,也是问题呵。
发表于 2012-10-4 01:36:48 | 显示全部楼层
通信的暂时我还没搞懂怎么回事....
发表于 2012-10-4 01:37:08 | 显示全部楼层
看了好几个教程都没搞得芯片.
发表于 2012-10-4 23:17:04 | 显示全部楼层
发表于 2012-10-5 09:19:28 | 显示全部楼层
不知外网能否实现,可能要改tcpip协议。
 楼主| 发表于 2012-10-5 17:41:54 | 显示全部楼层
非常感谢各位(尤其是8楼兄台)。已完全搞懂是怎么回事了,问题出在那里也知道。结贴!!!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-15 00:53 , Processed in 0.084213 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表