1.UDP 协议:
发送端不会确认接收端是否存在,就会发出数据,同样在接受到数据是也不会反馈。面向无连接协议,资源消耗小,通信效率高。通常用于音频、视频、普通数据的传输。
2.TCP
先连接在传输,每次连接的创建都需要经过三次握手。
第一次,客户端发送连接请求。
第二次 服务户端返回一个确认信息,
第三次 客户端再次发送确认信息。
速度较慢。面向连接协议,保证安全性。在数据上传和下载,不会因为安全性使得数据不完整。
3.UDP发送端
实现封装数据的类 Datagrampacket
实现数据传输的类 DatagramSocket
1. 封装数据 接收的地址和端口
2. 发送数据
3.关闭资源 发送对象
//创建数据包对象,封装要发送的数据,接受端IP,端口
byte[] date ="你好UDP".getBytes();
//创建InetAddress对象,封装好自己的IP地址
InetAddress inet=InetAddress.getByName("127.0.0.1");
DatagramPacket dp=new DatagramPacket(date,date.length,inet,6000);
//创建发送对象
DatagramSocket ds=new DatagramSocket();
ds.send(dp);
ds.close();
4.udp接收端
1.创建套接字 绑定端口号
2.创建字节数组,接收发来的数据
3.接收数据
4.拆包。IP地址, 端口号 字节数组
5.关闭资源
//创建数据包对象,绑定端口号
DatagramSocket ds=new DatagramSocket();
//创建自己数组
byte[] data =new byte[1024];
//创建数据包对象,传递字节数组
DatagramPacket dp =new DatagramPacket(data,data.length);
//调用接受方法
ds.receive(dp);
String ip=dp.getAddress().getHostAddress();
int port = dp.getPort();
int lenght = dp.getLength();
ds.close();
5.TCP客户端
//创建Socket对象,连接服务器
Socket socket =new Socket("127.0.0.1",8888);
//通过客户端的套接字对象,获取字节输出流,将数据写向服务器
OutputStream out=socket.getOutputStream();
out.write("服务器OK".getBytes());
socket.close();
6.TCP服务器端
ServerSocket serverSocket =new ServerSocket(8888);
//或者客户端套接字对象
Socket socket = serverSocket.accept();
//通过客户端套接字对象,socket获取字节输入流,读取客户端发送来的数据
InputStream inputStream = socket.getInputStream();
byte[] data =new byte[1024];
int len = inputStream.read(data);
//服务器端向客户端会数据 字节输出流,通过客户端套接字对象获取字节输出流
OutputStream out = socket.getOutputStream();
out.write("受到".getBytes());
socket.close();
serverSocket.close();
7.TCP图片上传
客户端:
实现步骤
1. 连接服务器
2. 获取输出流写图片
3.读取数据源
4.读取图片 写到服务器
5.获取字节输入流
6.关闭资源
Socket socket =new Socket("127.0.0.1",8000);
//获取字节输出流,图片写到服务其
OutputStream out = socket.getOutputStream();
//创建字节输入流,读取本机上 的图片
FileInputStream fis=new FileInputStream("d:\\sss.jpg");
//开始读写字节数组
int len=0;
byte[] bytes =new byte[1024];
while ((len=fis.read(bytes))!=-1){
out.write(bytes,0,len);
}
//给服务器写终止序列
socket.shutdownOutput();
//获取字节输入流,读取服务器的上传成功
InputStream in = socket.getInputStream();
len = in.read(bytes);
fis.close();
socket.close();
服务端:
1.ServerSocket套接字对象,监听端口8000
2.方法accept()获取客户端的连接对象
3.客户端连接对象获取字节输入流,读取客户端发送图片
4.创建FIle对象, 绑定上传文件夹
//判断文件夹是否存在,不存在就创建
5.创建字节输出流,数据目的所在文件夹
6.字节流读取图片,字节流图片写入到目的文件夹中
7.将上传成功回传
8关闭资源
ServerSocket server =new ServerSocket(8000);
Socket socket = server.accept();
//通过客户端连接对象,获取字节输入流,读取客户端图片
InputStream in = socket.getInputStream();
//将目的文件夹封装到file对象
File upload =new File("f:\\upload");
if (!upload.exists())
upload.mkdirs();
//防止文件重名被覆盖
//规则 域名+毫秒值+随机数
String filename="systemplus"+System.currentTimeMillis()
+new Random().nextInt(999999)+".jpg";
//创建字节输出流,将图片写入到目的文件夹中
FileOutputStream fos =new FileOutputStream(upload+File.separator+filename);
//读写字节数组
byte[] bytes =new byte[1024];
int len =0;
while ((len=in.read(bytes))!=-1){
fos.write(bytes,0,len);
}
//通过客户端连接对象获取字节输出流
//上传成功回写
socket.getOutputStream().write("上传成功".getBytes());
fos.close();
socket.close();
server.close();
8. 多线程上传
服务端;
ServerSocket server=new ServerSocket(8000);
while (true) {
//获取到一个客户端,必须开启新县城
Socket socket = server.accept();
new Thread(new Upload(socket)).start();
}
}
上传端:
public class Uploadimplements Runnable {
private Socketsocket;
public Upload(Socket socket){this.socket=socket;}
@Override
public void run() {
try {
//通过客户端连接对象,获取字节输入流,读取客户端图片
InputStream in =socket.getInputStream();
//将目的文件夹封装到file对象
File upload =new File("f:\\upload");
if (!upload.exists())
upload.mkdirs();
//防止文件重名被覆盖
//规则 域名+毫秒值+随机数
String filename ="systemplus" + System.currentTimeMillis()
+new Random().nextInt(999999) +".jpg";
//创建字节输出流,将图片写入到目的文件夹中
FileOutputStream fos =new FileOutputStream(upload + File.separator + filename);
//读写字节数组
byte[] bytes =new byte[1024];
int len =0;
while ((len = in.read(bytes)) != -1) {
fos.write(bytes, 0, len);
}
//通过客户端连接对象获取字节输出流
//上传成功回写
socket.getOutputStream().write("上传成功".getBytes());
fos.close();
socket.close();
}
catch (Exception ex){
}
}
}
我是一个自学Android和JavaWeb的菜鸟。如果可以Flower一下我的GitHub。感激不尽
https://github.com/FoxconnPeter