找回密码
 加入
搜索
楼主: 261869247

[网络通信] 【已解决】 UDP发送一张图片到服务端如何保存

 火.. [复制链接]
发表于 2010-7-28 00:24:21 | 显示全部楼层
回复 1# 261869247

要实现这个不难,不过用UDP协议来传送文件,很容易掉包,如果不是群发,最好用TCP

下面给你写个UDP发送图片和接收的例子:
先运行服务端,再运行发送端

服务端:
UDPStartup()

$socket = UDPBind("127.0.0.1", 12345)

If @error <> 0 Then Exit
$file = FileOpen ("2.jpg",18)
$i=0
While 1
        $data = UDPRecv($socket, 1024 * 1000, 1)
        If $data <> "" Then
                $data2 = BinaryToString($data, 4);增加:将二进制数据转换成字符
                If $data2 = "done" Then
                        FileClose ($file)
                        ShellExecute("2.jpg")
                        Exit        
                EndIf
        FileWrite($file, $data)
        $i+=1
        ToolTip("接收到第"&$i&"个包",200,300)
        EndIf
WEnd
发送端:
UDPStartup()

$socket = UDPOpen("127.0.0.1", 12345)
$file = FileOpen ("1.jpg",16)
$i=0
While 1
        $data = FileRead ($file,512)
        If @error == -1 Then
                UDPSend($socket,StringToBinary ("done",4))
                FileClose ($file)
                ExitLoop
        EndIf
        UDPSend($socket,$data)
        $i+=1
        ToolTip ("发送第"&$i&"个包" ,100,300)
        Sleep (2)
WEnd
UDPCloseSocket($socket)
UDPShutdown()
接收完毕后,会打开2.jpg文件,一般来说,本地测试问题不大,如果是网络测试,掉包的可能性大增,就不一定能接收到全部的包了。

评分

参与人数 1金钱 +20 贡献 +2 收起 理由
afan + 20 + 2

查看全部评分

 楼主| 发表于 2010-7-27 23:23:33 | 显示全部楼层
谢谢C.L 测试下!
发表于 2010-8-11 21:00:35 | 显示全部楼层
回复 17# C.L


    C.L大师请问能否将你写的这个UDP图片传送服务端及发送端改写一个TCP传送方式的啊,谢谢啦,
发表于 2010-8-12 02:55:07 | 显示全部楼层
回复 18# txm888

给你写个TCP的例子,先运行服务端,再运行发送端
服务端:
TCPStartup()
$socket = TCPListen("127.0.0.1", 12345)
If @error <> 0 Then Exit
$file = FileOpen ("2.jpg",18)
$data2 = ""
$i = 0
While 1
        $ConnectedSocket = TCPAccept($Socket)
        If $ConnectedSocket == -1 Then ContinueLoop
        While 1
                $data = TCPRecv($ConnectedSocket, 1024, 1)
                If @error Then $data = "done"
                If $data <> "" Then
                        If BinaryLen ($data) < 50 Then $data2 = BinaryToString($data, 4)
                        If $data2 = "done" Then
                                        FileClose ($file)
                                        ShellExecute("2.jpg")
                                        Exit
                        EndIf
                        FileWrite($file, $data)
                        $i+=1
                        ToolTip("接收到第"&$i&"个包",200,500)
                EndIf
        WEnd
WEnd

TCPCloseSocket($socket)
TCPshutdown()
发送端:
TCPStartup()

$socket = TCPConnect("127.0.0.1", 12345)
If $socket = -1 Then
        MsgBox(0, "出错", "连接到服务器出错,请先运行服务端软件")
        Exit
EndIf
$file = FileOpen ("1.jpg",16)
$i=0
While 1
        $data = FileRead ($file,1024)
        If @error == -1 Then
                TCPSend($socket,StringToBinary ("done",4))
                FileClose ($file)
                                Exit
        EndIf
       TCPSend($socket, $data)
           $i += 1
           ToolTip ($i,100,200)
WEnd
TCPCloseSocket($socket)
TCPshutdown()

评分

参与人数 1威望 +2 收起 理由
afan + 2

查看全部评分

发表于 2010-8-12 09:06:00 | 显示全部楼层
呵呵学习一下,最好还是TCP,稳定安全
 楼主| 发表于 2010-8-12 10:52:44 | 显示全部楼层
回复  txm888

给你写个TCP的例子,先运行服务端,再运行发送端
服务端:发送端:
C.L 发表于 2010-8-12 02:55



    C.L大哥发送的图片和接受的图片名字要一样可以做到吗
比如 发送 123.jpg
接收的时候也 123.jpg
发表于 2010-8-12 21:19:37 | 显示全部楼层
回复 21# 261869247

发送的图片和接受的图片名字要一样可以做到吗
比如 发送 123.jpg
接收的时候也 123.jpg


可以的,不过这里有两种方式,我不知道你想说的是那种方式:
1、服务端已经知道发送端发过来的名字,属于预先协定好的文件命名,比如上面的例子,这种方式,就是在服务端里用名字”1.jpg”接收就可以了
2、 服务端不知道发送端将发送什么文件名的文件,而是按发送端发过来的信息确定接收到的文件来命名文件名,这种方式就比较复杂一些,但也是可以实现的。我以前因自已需要也写过类似的代码,但没有保存到,用完就删除掉了,你可以自已先试着写些代码来测试,应该不难。
 楼主| 发表于 2010-8-13 06:51:21 | 显示全部楼层
是第2种服务端要接受来自不同IP的图片 保存到服务器 这些图片都是发送图片的IP命名的
我来试试 嘿嘿
发表于 2010-10-12 03:37:38 | 显示全部楼层
收藏了~~~~~~~~~~~~
发表于 2010-10-12 17:17:47 | 显示全部楼层
好难啊  看不懂啊
发表于 2011-12-5 22:29:06 | 显示全部楼层
真是好东西阿!
发表于 2012-12-23 19:13:16 | 显示全部楼层
刚刚试过了,接收不成功,0KB
看代码应该是可以的,觉得是缺少了一个同步的操作。
发表于 2013-6-22 22:23:05 | 显示全部楼层
大哥能不能弄个在指定的文件夹里自动检测到有相片更新就发送,在服务端右下角最好有个小方框提示。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-16 16:15 , Processed in 0.073694 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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