|
|
|
2009/3/31(Tue) 00:36:37|NO.24270
以前の質問でサンプルでもあればと書いてあったので作ってみました。
参考にでもお使い下さい。
#include"hspsock.as"
//変数IPを文字列型に(ついでにPathも)
sdim IP
sdim path
screen 0,320,120
objsize 120,40
button"ファイル送信",*sendfile
button"ファイル受信",*getfile
stop
; ▼▼▼サーバー側▼▼▼
*sendfile
//サーバー側がファイル送信。
cls
mes"ポート番号"
input port,320,20,5
mes"送信するファイル"
input path,300,20,5
objsize 20,20
pos 300,ginfo(23)-20
button"...",*SendFileSelect
objsize 120,30
pos 190,85
button"ポート開放",*Server
*SendFileSelect
dialog"*",16
if stat=1 {
path=refstr
objprm 1,path
}
stop
*Server
exist path
if strsize<=0:dialog"ファイルが選択されていないか存在しません。":stop
FileSize=strsize
//ソケットを初期化
sockmake 0,port
if stat!0:dialog"ソケットの初期化に失敗しました。":stop
cls
//IPアドレスを取得、表示。LAN外での通信の場合はグローバルIPアドレスが必要です。
ipget
title"IPアドレス : "+refstr
//ここからクライアント待ち
repeat
sockwait 0
if stat=0:break
if stat>1:dialog"クライアントを待つ際にエラーが発生しました。":goto,*exit
wait 1
loop
//通信成功
onexit,*exit
//ファイル送信開始
//ファイル情報を文字列型変数で相手に送信
//1行目にファイル名、2行目にファイル容量
sdim FileInfo
FileInfo=getpath(path,8)+"\n"+FileSize
sockput FileInfo,0
//相手がファイル情報を確認できたことを確認したらファイル送信開始
repeat
sockcheck 0
if stat=0:break
wait 1
loop
sockgetc check,0
//ファイル情報を送信
sdim FileData,FileSize
bload path,FileData,FileSize
//容量分を一気に送信
sockputb FileData,0,FileSize,0
//相手が受信完了し、返信が来るのを待つ。
//相手の受信完了を確認する
repeat
sockcheck 0
if stat=0:break
wait 1
loop
sockputc check,0
//終了
goto,*exit
; ▼▼▼クライアント側▼▼▼
*getfile
//クライアント側はファイル受信。
cls
mes"IPアドレス"
input IP,320,20,15
mes"ポート番号"
input port,320,20,15
objsize 120,30
pos 190,85
button"接続",*Client
stop
*Client
sockopen 0,IP,port
if stat!0:dialog"接続に失敗しました。":stop
//接続成功
onexit,*exit
//ファイル受信開始
//ファイル情報を受け取るまで待つ
repeat
sockcheck 0
if stat=0:break
wait 1
loop
//getフォルダがなければ作成
dirlist note,"Get",5
if stat=0:mkdir"Get"
//ファイルの情報を取得
notesel FileInfo
sockget FileInfo,40960,0
noteget FileName,0
noteget FileSize,1:FileSize=int(FileSize)
//確認完了をサーバーに送信
sockputc 0,0
//受信容量が見やすくなるようにウィンドウを大きくしてみました
screen 0,640,120
//ここから受信開始
total=0
sdim FileData,FileSize
repeat
//ファイルデータの着信確認
sockcheck 0
if stat=0 {
//FileData変数にデータを読み込む。
sockgetb FileData,total,FileSize-total,0
//オフセット用にtotalに受信したサイズstatを加算していく。
total=total+stat
title""+total+"byte受信完了 : 受信サイズ"+stat+"byte"
}
//受信サイズがファイルサイズなら終了
if total=FileSize:break
wait 10
loop
//ファイルを保存
bsave"Get/"+FileName,FileData,FileSize
//確認用に1byte送信
sockputc 0,0
//終了
*exit
sockclose 0
end
| |
|
2009/3/31(Tue) 07:38:35|NO.24272
朝起きてこちらを見てびっくりしました・・・。
色々ヒントももらい、更にサンプルまで用意してもらってありがとうございます。
お手数おかけしましたm(__)m
このサンプルを参考にさせていただいて完成まで運べたら・・・と思います。
ありがとうございました。
|
|
2009/4/1(Wed) 23:02:45|NO.24327
この方法だと大きなファイルを送信したときに
とびませんか?
|
|
2009/4/1(Wed) 23:37:21|NO.24328
>>kiさん
HSPで通常扱える数値は2147483648、つまり2GBまでなので、それ以上のファイルは
扱えないことは想定していますが、もしかして2GB以内のファイルでも失敗しますか?
あと、容量の大きなファイルを送信すると送信時に時間がかかるみたいなので改善してみます。
|
|
2009/4/1(Wed) 23:40:58|NO.24329
100MBでは成功しましたが、400MBだと失敗しました。
すみませんでした、訂正完了後、スクリプトを上げたいと思います。
|
|
2009/4/2(Thu) 00:42:21|NO.24332
550までは確認がとれました。
改良するところは、
Sdimでメインメモリフルに使うと
とぶので100ぐらいづつ送ると
いいかもしれません。
改良されてアップされるの待ってます。
|
|
2009/4/2(Thu) 01:00:55|NO.24333
再び長いスクリプトを申し訳ございません、完成しました。
一応1.72GBのファイルも問題なく送信出来ました。
#include"hspsock.as"
//変数IPを文字列型に(ついでにPathも)
sdim IP
sdim path
screen 0,320,120
objsize 120,40
button"ファイル送信",*sendfile
button"ファイル受信",*getfile
stop
; ▼▼▼サーバー側▼▼▼
*sendfile
//サーバー側がファイル送信。
cls
mes"ポート番号"
input port,320,20,5
mes"送信するファイル"
input path,300,20,5
objsize 20,20
pos 300,ginfo(23)-20
button"...",*SendFileSelect
objsize 120,30
pos 190,85
button"ポート開放",*Server
*SendFileSelect
dialog"*",16
if stat=1 {
path=refstr
objprm 1,path
}
stop
*Server
exist path
if strsize<=0:dialog"ファイルが選択されていないか存在しません。":stop
FileSize=strsize
//ソケットを初期化
sockmake 0,port
if stat!0:dialog"ソケットの初期化に失敗しました。":stop
cls
//IPアドレスを取得、表示。LAN外での通信の場合はグローバルIPアドレスが必要です。
ipget
title"IPアドレス : "+refstr
//ここからクライアント待ち
repeat
sockwait 0
if stat=0:break
if stat>1:dialog"クライアントを待つ際にエラーが発生しました。":goto,*exit
wait 1
loop
//通信成功
onexit,*exit
//ファイル送信開始
//ファイル情報を文字列型変数で相手に送信
//1行目にファイル名、2行目にファイル容量
sdim FileInfo
FileInfo=getpath(path,8)+"\n"+FileSize
sockput FileInfo,0
//相手がファイル情報を確認できたことを確認したらファイル送信開始
repeat
sockcheck 0
if stat=0:break
wait 1
loop
sockgetc check,0
//残り送信サイズをSendFileSizeに代入
SendFileSize=FileSize
//見易くするために
screen 0,640,120
//一度に送信するサイズを指定
sending=500*1024
sdim FileData,sending
repeat
//ファイルを必要な分だけ読み込んで、送信
bload path,FileData,limit(sending,0,SendFileSize),cnt*sending
sockputb FileData,0,limit(SendFileSize,0,sending),0
SendFileSize-sending
if SendFileSize<=0:break
color 255,255,255:boxf
color:pos 0,0
mes"残り"+SendFileSize+"byte"
mes""+int(100.0-double(SendFileSize)/FileSize*100)+"%完了"
wait 1
loop
; sockputb FileData,0,FileSize,0
//相手が受信完了し、返信が来るのを待つ。
//相手の受信完了を確認する
repeat
sockcheck 0
if stat=0:break
wait 1
loop
sockputc check,0
//終了
goto,*exit
; ▼▼▼クライアント側▼▼▼
*getfile
//クライアント側はファイル受信。
cls
mes"IPアドレス"
input IP,320,20,15
mes"ポート番号"
input port,320,20,15
objsize 120,30
pos 190,85
button"接続",*Client
stop
*Client
sockopen 0,IP,port
if stat!0:dialog"接続に失敗しました。":stop
//接続成功
onexit,*exit
//ファイル受信開始
//ファイル情報を受け取るまで待つ
repeat
sockcheck 0
if stat=0:break
wait 1
loop
//getフォルダがなければ作成
dirlist note,"Get",5
if stat=0:mkdir"Get"
//ファイルの情報を取得
notesel FileInfo
sockget FileInfo,40960,0
noteget FileName,0
noteget FileSize,1:FileSize=int(FileSize)
//確認完了をサーバーに送信
sockputc 0,0
//受信容量が見やすくなるようにウィンドウを大きくしてみました
screen 0,640,120
//ここから受信開始
total=0
sdim FileData,500*1024
bsave"Get/"+FileName,FileData,0
repeat
//ファイルデータの着信確認
sockcheck 0
if stat=0 {
//FileData変数にデータを受信
sockgetb FileData,0,FileSize-total,0
//オフセットを使用し、受信した分を保存
bsave"Get/"+FileName,FileData,stat,total
//オフセット用にtotalに受信したサイズstatを加算していく。
total=total+stat
color 255,255,255:boxf
color:pos 0,0
mes""+total+"byte受信完了 : 受信サイズ"+stat+"byte"
mes""+int(double(total)/FileSize*100)+"%完了"
}
//受信サイズがファイルサイズなら終了
if total=FileSize:break
wait 1
loop
//ファイルを保存
//確認用に1byte送信
sockputc 0,0
//終了
*exit
sockclose 0
end
| |
|
2009/4/2(Thu) 23:01:05|NO.24359
やはりうまく送受信できてないですね。
単品だと良くできてもZIPで圧縮したのが
よく3Mか6Mくらいしかできてなかったりしますね。
なにかエラーってますよ。
|
|
2009/4/3(Fri) 11:03:01|NO.24368
自分だけですか?
|
|
2009/4/3(Fri) 18:38:37|NO.24390
11MBのファイルを作って送ってみましたが、バイナリエディタで見ても異常はありませんでした。
環境によって送信できる最大サイズも違うかもしれないので[sending]変数の値を小さくしたらできないでしょうか?
私自身もソケット関係の命令は未だわからない部分が多いので…もうすこし調べてみたいと思います。
|
|