我知道TCP最好发送文件,但我有一个关于通过udp协议发送文件的功课。 C#或Java中有关于发送文件的代码示例吗?
我有服务器客户端示例来发送和接收消息。我尝试使用相同的方式发送文件,但无法成功。我可能需要一个算法来分割文件的小部分并通过数据报发送它们,我有一个想法是将部件的“md5”作为数组的标头来检查数据包是否丢失。
这是我的尝试,我在java中的服务器端;
// 1. creating a server socket, parameter is local port number
sock = new DatagramSocket(7777);
// buffer to receive incoming data
byte[] buffer = new byte[65536];
DatagramPacket incoming = new DatagramPacket(buffer, buffer.length);
byte []bigByteArray=new byte[1024*1024*1024*1024];
// 2. Wait for an incoming data
echo("Server socket created. Waiting for incoming data...");
ByteBuffer target = ByteBuffer.wrap(bigByteArray);
// communication loop
while(true)
{
try
{
sock.receive(incoming);
String s = new String(incoming.getData());
if(s=="finish") break;
target.put(incoming.getData());
}
catch(Exception e)
{
}
}
fos.write(bigByteArray);
fos.close();echo("RECIEVED");
和我的客户方;
String s;
Path path=Paths.get("C:\\Users\\Toshiba\\Desktop\\aa.txt");
byte[] data = Files.readAllBytes(path);
try
{
sock = new DatagramSocket();
InetAddress host = InetAddress.getByName("localhost");
//take input and send the packet
byte [] part;
for (int i = -1; i < data.length; i=i+100)
{
if(sock.isConnected())
{
part=Arrays.copyOfRange(data,i+1,i+100 );
}
else i=i-100;
}
byte [] f="finish".getBytes();
DatagramPacket finalpac = new DatagramPacket(f ,f.length , host , port);
sock.send(finalpac);
}
提前谢谢。
答案 0 :(得分:1)
几个问题:
以下内容不正确:
sock.receive(incoming);
String s = new String(incoming.getData());
最后一行应该是
String s = new String(incoming.getData(), incoming.getOffset(), incoming.getLength());
如果您没有接收文字,则根本不应将数据转换为String
。
删除sock.isConnected()
测试。 DatagramSockets
通常没有联系,你肯定没有连接这个。
嵌入此循环的循环没有任何用处。您只发送&#34;完成&#34;。