您的位置:首页 > 理论基础 > 计算机网络

使用UPD 和 TCP 发送接收大文件

2018-03-31 13:27 337 查看
UDP
发送端package com.lzj.udp;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

//发送端UPD,发送给本机得9988端口
public class SendUdp {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9989);

// 发送文件缓存数组
byte[] sendFileBuff = new byte[1024 * 40];
BufferedInputStream bufferedIn = new BufferedInputStream(new FileInputStream(new File("E://APAA280.avi")));

// 确认信息缓存数组
byte[] confirmMsg = new byte[1024];
DatagramPacket msgPacket = new DatagramPacket(confirmMsg, confirmMsg.length);

int len = 0;
// 循环读取需要发送的文件
while ((len = bufferedIn.read(sendFileBuff)) != -1) {
// 发送文件数据报 分块发送
DatagramPacket dgp = new DatagramPacket(sendFileBuff, sendFileBuff.length, InetAddress.getLocalHost(),
9988);
// 等待对方回复,收到回复再继续发送,没收到回复重新发送一次
socket.setSoTimeout(3000);
while (true) {
socket.send(dgp);
socket.receive(msgPacket);//receive是阻塞方法,未收到会一直等待
String confirmMsgString = new String(msgPacket.getData(),0,msgPacket.getLength());
System.out.println(confirmMsgString);
break;
}
}
//文件传输完毕后发送ok
DatagramPacket dgp = new DatagramPacket("ok".getBytes(), "ok".getBytes().length, InetAddress.getLocalHost(),9988);
socket.send(dgp);
socket.close();
}

}接收端package com.lzj.udp;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UPDRecevie {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(9988);

//接受文件缓存数组
byte[] recFileBuff = new byte[1024*40];
DatagramPacket recFilePacket = new DatagramPacket(recFileBuff, 1024*40);
//回复对方 已收到文件
DatagramPacket comfirmMsgPacket = new DatagramPacket("getFile".getBytes(), "getFile".getBytes().length,InetAddress.getLocalHost(),9989);
File file = new File("E://day32//hehe.avi");
BufferedOutputStream buffOut = new BufferedOutputStream(new FileOutputStream(file));

//循环接受文件,当收到对方发来的ok时,结束文件接收
while(true){
socket.receive(recFilePacket);
if(new String(recFilePacket.getData(),0,recFilePacket.getLength()).equals("ok")){

break;//文件接受完毕,跳出
}
//往缓冲流中写入收到的数据包
buffOut.write(recFilePacket.getData(),0,recFilePacket.getLength());
buffOut.flush();
//给对方回复 让他继续发送
socket.send(comfirmMsgPacket);

}

}
}TCP
服务端:package com.lzj.tcp;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerTCP {

public static void main(String[] args) throws Exception {

//创建服务端Socket
ServerSocket serverSocket = new ServerSocket(12999);

//等待客户端连接 accept阻塞方法
Socket clientSocket = serverSocket.accept();

System.out.println(clientSocket.getInetAddress()+"已连接");

//文件写入缓冲流
@SuppressWarnings("resource")
BufferedOutputStream bufStream = new BufferedOutputStream(new FileOutputStream(new File("D://struts-2.3.24-all.zip")));
int len = 0;int count=0;
byte[] buff = new byte[1024*50];
InputStream in = clientSocket.getInputStream();
while((len = in.read(buff)) != -1){
bufStream.write(buff, 0, len);
System.out.println(++count);
}

//告诉客户端已经收到!
clientSocket.getOutputStream().write("OK".getBytes());

}

}
客户端package com.lzj.tcp;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.InetAddress;
import java.net.Socket;

public class ClientTCP {

public static void main(String[] args) throws Exception {

//创建客户端TCP Socket
Socket clientSocket = new Socket(InetAddress.getLocalHost(),12999);

//读取需要上传的文件到缓冲流
BufferedInputStream bufStream = new BufferedInputStream(new FileInputStream(new File("E://struts-2.3.24-all.zip")));
int len = 0;
byte[] buff = new byte[1024*50];

//接受服务端确认的字节数组
byte[] b = new byte[100];
//读物缓冲流到Socket输入流
while((len = bufStream.read(buff)) != -1){
clientSocket.getOutputStream().write(buff, 0, len);
}
//发送完毕关闭输出流 输出流一旦关闭 服务端退出while循环 ,给客户端返回成功消息
clientSocket.shutdownOutput();

len = clientSocket.getInputStream().read(b);
if(new String(b,0,len).equals("OK")){
System.out.println("OK");
}

//关闭资源
bufStream.close();
clientSocket.close();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: