找回密码
 加入
搜索
查看: 11771|回复: 13

[网络通信] (已解决)一个服务端、客户端,Socket正常,但不能接受到客户端数据。 SOS...

 火.. [复制链接]
发表于 2014-7-4 13:20:16 | 显示全部楼层 |阅读模式
本帖最后由 lamant 于 2014-7-9 12:26 编辑

现在服务端接收不到客户端的信息,收不到啊!收不到啊!收不到啊!

经测试服务端、客户端的socket是OK的。(如果connectsocket不等于-1就弹框,果然弹了!)

客户端在楼下。

客户端+服务端总体,想实现的是:客户端电脑上的一个TXT文本被修改了,客户端发现并读取该TXT的最后一行,传递给服务端。

看了很多例子,帮助文档,无奈理解能力太差,实在弄不明白,到底是客户端发送有问题呢,还是服务端接收有问题。
ip.ini文件内容:

[服务器地址]
IP=127.0.0.1
Port=65432
Opt('TrayAutoPause', 0)

ssetup()

Func ssetup()

    TCPStartup()

    Global $S_IP, $S_Port, $iSocket

    $S_IP = IniRead("iP.ini", "服务器地址", "IP", "")

    $S_Port = IniRead("iP.ini", "服务器地址", "Port", "")

    $iSocket = TCPListen($S_IP, $S_Port)

    If $iSocket = -1 Then Exit ; 创建监听不成功就退出

EndFunc

Local $sRecv, $StringRev, $ConnectedSocket

While 1

   $ConnectedSocket = TCPAccept($iSocket)

    If $ConnectedSocket <> -1 Then

       MsgBox(0,"服务端检测到连接", "binggo!")

           while 1

              $sRecv = TCPRecv($iSocket, 2048)

              If $sRecv <> "" Then

             MsgBox(0,"服务端接收到数据", "binggo!") ;接收到不为空的数据,弹框提示! 可是这个框框从来没有弹出来过!

                 $StringRev =  BinaryToString($sRecv, 4)

             MsgBox(0,"服务端提示",$StringRev) ;弹框提示客户端传来的读取到的最后一行文本。也是从来没有成功过!

              EndIf

       WEnd

        EndIf

WEnd

;OnAutoItExitRegister("ex1") ;因为服务端要常开,因此不需要此段?

;Func  ex1()

    ;TCPCloseSocket($iSocket)

    ;TCPShutdown()

;EndFunc
发表于 2014-7-4 14:51:57 | 显示全部楼层
回复 1# lamant

请帮忙看看这个服务端能不能正常接收,Thanks!

請按下 F5 就可以知道 能不能正常 WORK!!
 楼主| 发表于 2014-7-4 15:09:57 | 显示全部楼层
本帖最后由 lamant 于 2014-7-5 11:48 编辑

回复 2# kk_lee69

楼上的大哥,看来我的表达不清楚。
按F5运行没出错。

贴上客户端吧。我想实现的是客户端电脑上的一个TXT文本"D:\AutoIt3\1.txt"被修改了,客户端发现并读取该TXT (D:\AutoIt3\1.txt) 的最后一行,传递给服务端。

我真是看了很多帮助文档,查了很多例子。就是不知道问题出在哪。
#include <WinAPIFiles.au3>

#include <APIFilesConstants.au3>

#include <WinAPI.au3>

#include <MsgBoxConstants.au3>


Opt('TrayAutoPause', 0)

Global Const $sPath = "D:\AutoIt3"

Global $hObj[1]

$hObj[0] = _WinAPI_FindFirstChangeNotification($sPath, $FILE_NOTIFY_CHANGE_LAST_WRITE)

Local $tObj = DllStructCreate('ptr;ptr')

Local $pObj = DllStructGetPtr($tObj)

DllStructSetData($tObj, 1, $hObj[0])

TCPStartup()

;OnAutoItExitRegister("ex1")

Global $S_IP, $S_Port, $iSocket

$S_IP = IniRead("iP.ini", "服务器地址", "IP", "")

$S_Port = IniRead("iP.ini", "服务器地址", "Port", "")

$iSocket = TCPConnect($S_IP, $S_Port)

If $iSocket = -1 Then Exit

Local $ID, $sFileRead, $str1, $strl_1

$Str1 = 1

While 1

        Sleep(100)

    $ID = _WinAPI_WaitForMultipleObjects(1, $pObj, 0, 0)

    Switch $ID

        Case 0

           $sFileRead = FileReadLine("D:\AutoIt3\1.txt",-1)

                   if  $sFileRead <> $Str1 Then ;与上一次读取的最后一行比较,如果不一样就输出

                            MsgBox(0,"客户端提示",$sFileRead) ;程序运行正常,这个框框读取的值是正确的。

                                $str1 = $sFileRead

                            $str1_1 = StringToBinary($sFileRead, 4)

                            TCPSend($iSocket, $str1_1) ;发送读取到的最后一行文本到服务端,好像没有发送出去

                   EndIf

        Case Else

            ContinueLoop

    EndSwitch

    If Not _WinAPI_FindNextChangeNotification($hObj[0]) Then Exit

WEnd

Func  ex1()

    TCPCloseSocket($iSocket)

    TCPShutdown()

EndFunc
发表于 2014-7-4 15:16:18 | 显示全部楼层
回复 3# lamant

一个简单的局域网群聊天示例
http://www.autoitx.com/forum.php ... hlight=%C1%C4%CC%EC
   
简易聊天工具~源码公开~供新手YY
http://www.autoitx.com/forum.php ... hlight=%C1%C4%CC%EC

http://www.autoitx.com/search.ph ... mp;searchsubmit=yes

一堆的案例  足夠你找出原因的~~
 楼主| 发表于 2014-7-4 15:19:19 | 显示全部楼层
回复 4# kk_lee69

哥,这些例子我也看了很多,搜索了不少。就是没解决问题。
我贴的程序也没几行,超简单的。
发表于 2014-7-4 15:32:00 | 显示全部楼层
回复 5# lamant

呵呵  我對這個不熟  也沒興趣研究這個  所以幫不了你

只是我能確定的是  把那些所謂的簡單聊天的程式 把裡面的 程式語法弄懂了  一段一段拆解開來,知道原理後,你的沒幾行的程序  肯定有解的
发表于 2014-7-4 15:43:08 | 显示全部楼层
楼主说看了很多例子,可服务端例子中TCPAccept()一句都 是放在while循环里的呀。
 楼主| 发表于 2014-7-4 16:16:09 | 显示全部楼层
本帖最后由 lamant 于 2014-7-4 16:27 编辑

回复 7# shqf
刚刚测试了一下,放外边跟放里边是一样的。
socket都是好的。
发表于 2014-7-4 17:02:47 | 显示全部楼层
本帖最后由 shqf 于 2014-7-4 17:10 编辑

楼主,服务端17句放到20行,服务端应该没问题了。
可客户端代码问题大了。根本不能运行啊!
你确信运行了不报错?????
你有无用SciTE写脚本啊?里面菜单-工具-语法检查,你试一下,客户端代码问题一大堆,if与endif都没配对啊!
 楼主| 发表于 2014-7-5 08:52:00 | 显示全部楼层
回复 9# shqf

哥我重新整了一下代码。这次调试没问题。之前是因为我有一个ini文件,随手改了一下。
发表于 2014-7-6 16:52:04 | 显示全部楼层
服务端改得太多,又不对,存在 31和45行,$ConnectedSocket = TCPAccept($iSocket)一句等于又在循环外啊。去掉 31和45行,其他都不要动。
再调试客户端,不行的话,客户端按照帮助中的例子,只保留必要的发送功能,行了以后,再慢慢加上其他代码 吧。
 楼主| 发表于 2014-7-7 11:57:25 | 显示全部楼层
回复 12# shqf


    确认是套接字错误了!@error=-1!
但是不知道怎么弄!!!
发表于 2014-7-8 15:14:28 | 显示全部楼层
学习。。。。。。。。。。。。。
 楼主| 发表于 2014-7-9 12:27:20 | 显示全部楼层
回复 12# shqf


    谢谢兄弟,问题解决了。
    接收时的套接字用错了。应该用accept的套接字。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-28 18:51 , Processed in 0.077422 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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