2013-08-23 22 views
0

我想通过TCP套接字发送文件,但它只发送第一个1024字节,我试图看看C#代码,但无法弄清楚。该文件是二进制格式,如果有帮助有人能让我知道我失踪了什么?Powershell TCP发送整个文件

客户

$test=[io.file]::ReadAllBytes("c:\test"); 
$socket = New-Object net.sockets.tcpclient('192.168.1.202',8080); 
$stream = $socket.GetStream(); 
$stream.write($test,0,$test.Length); 
$writer.flush(); 
$socket.close() 

服务器

#!/usr/bin/env ruby 
require 'socket' 
begin 
    server = TCPServer.open(8080) 
    client = server.accept 
    recv_length = 1024 
    out_put = '' 
    while (tmp = client.recv(recv_length)) 
    out_put += tmp 
    break if tmp.length < recv_length 
    end 
    File.open("test.txt",'w') {|f| f.write(out_put)} 
    server.close 
end 

旁注,如果我尝试Base64编码$测试它有一个适应和甚至没有尝试通过发送任何数据。

编辑:

以下工作。我改变了服务器而不是recv,现在它只是提取所有内容并等待客户端关闭套接字。

客户

$test=[System.Convert]::ToBase64String([io.file]::ReadAllBytes("c:\test")); 
$socket = New-Object net.sockets.tcpclient('172.26.4.26',8080); 
$stream = $socket.GetStream(); 
$writer = new-object System.IO.StreamWriter($stream); 
$buffer = new-object System.Byte[] 1024; 
$writer.WriteLine($test); 
$socket.close() 

服务器

#!/usr/bin/env ruby 
require 'socket' 
require 'base64' 
begin 
    server = TCPServer.open(8080) 
    client = server.accept 
    out_put = client.gets() 
    File.open("test","w") {|f| f.write(Base64.decode64(out_put))} 
end 

回答

0

客户

$test=[System.Convert]::ToBase64String([io.file]::ReadAllBytes("c:\test")); 
$socket = New-Object net.sockets.tcpclient('172.26.4.26',8080); 
$stream = $socket.GetStream(); 
$writer = new-object System.IO.StreamWriter($stream); 
$buffer = new-object System.Byte[] 1024; 
$writer.WriteLine($test); 
$socket.close() 

服务器

#!/usr/bin/env ruby 
require 'socket' 
require 'base64' 
begin 
    server = TCPServer.open(8080) 
    client = server.accept 
    out_put = client.gets() 
    File.open("test","w") {|f| f.write(Base64.decode64(out_put))} 
end 
0

我只能猜测,但它可能与服务器端的代码?

recv_length = 1024 

编辑:

你可以尝试流的结束,也许这就是问题所在?

$stream.write($test,0,$test.Length); 
$stream.close(); 
$writer.flush(); 
+0

可惜不是while循环将采取所有数据,然后将其写入文件一旦全部聚集。但作为一个测试,我已经试图将其提升到2048年,并且它只获得了1024个,所以它必须是PowerShell(客户端)的东西。 – b00stfr3ak

+0

关闭流也没有改变输出。 – b00stfr3ak