使用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();
}
}
发送端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();
}
}
相关文章推荐
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- qt 下UDP消息的接收和发送和TCP发送文件
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
- Qt5--学习笔记-TCPsocket文件发送、接收
- C#使用Socket发送和接收TCP数据示例
- windows C++使用socket发送和接收文件
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- tcp 发送接收文件
- C# Net.Sockets 使用TcpListener发送接收数据
- C#使用Socket发送和接收TCP数据实例
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- Dynemic Web Project中使用servlet的 doGet()方法接收来自浏览器客户端发送的add学生信息形成json字符串输出到浏览器并保存到本地磁盘文件
- Qt5 基于TCP传输的发送/接收文件服务器(支持多客户端)
- 使用HttpClient4实现文件上传请求的发送,服务器端以MultipartFile形式接收(附依赖jar包地址)
- 前端使用c# winform创建客户端来进行post发送文件,后台使用java来接收
- TCP使用(二)多用户发送文件和登录
- 如何使用TCP向远端SERVER传输数据 (发送与接收)
- 如何通过Socket TCP发送并接收一个文件?
- 使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题