十五(二)、网络编程之通过TCP/UDP实现文件传输
一、TCP/UDP协议:
TCP协议:
- 使用TCP协议前,须先建立TCP连接,形成传输数据通道
- 传输前,采用3次握手形式,点对点通信,是可靠的
- TCP协议进行通信的两个应用进程:客户端、服务端;
- 在连接中可进行大数据量的传输;
- 传输完毕,需要释放已经建立的连接,效率低;
UDP协议:
- 将数据、源、目的封装成数据包,不需要建立连接;
- 每个数据报的大小限制在64k内
- 发送不管对方是否准备好,接收方收到也不确认,所以是不可靠的
- 可以广播发送
- 发送结束无需释放资源,开销小,速度快;
- DatagramSocket和DatagramPacket实现了基于UDP协议的网络编程;
二、TCP网络编程实例
1 package io; 2 import java.io.File; 3 import java.io.FileInputStream; 4 import java.io.FileOutputStream; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.net.InetAddress; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 11 import org.junit.Test; 12 13 //TCP编程实例3,从客户端发送文件到服务器,服务器保存到本地,并返回发送成功给、客户端,并关闭相应的连接 14 public class TestTCP3 { 15 @Test 16 public void client() throws Exception{ 17 //1、创建一个Socket的对象,指明ip和端口号 18 Socket s = new Socket(InetAddress.getByName("127.0.0.1"),9898); 19 //2.获取 一个输出流,用于输出数据 20 OutputStream os = s.getOutputStream(); 21 FileInputStream fis = new FileInputStream(new File("/Users/lixiuming/Desktop/商品详情图片/detail-1.jpg")); 22 byte[] b = new byte[1024]; 23 int len; 24 while((len = fis.read(b))!=-1){ 25 os.write(b,0,len);//3.写出数据操作 26 } 27 s.shutdownOutput(); 28 //4.得到服务端发送过来的消息 29 InputStream is = s.getInputStream(); 30 byte[] b1 = new byte[1024]; 31 int len1; 32 while((len1 = is.read(b1)) != -1){ 33 String str = new String(b1,0,len1); 34 System.out.println(str); 35 } 36 //5.关闭相应的流和Socket 37 is.close(); 38 os.close(); 39 fis.close(); 40 s.close(); 41 42 43 44 } 45 46 @Test 47 public void server() throws Exception{ 48 //1.创建一个ServerSocket,指明端口号 49 ServerSocket ss = new ServerSocket(9898); 50 //2.调用一个accept,返回一个socket对象 51 Socket s = ss.accept(); 52 //3.获取收入类,读取数据; 53 InputStream is = s.getInputStream(); 54 FileOutputStream fos = new FileOutputStream(new File("2.jpg")); 55 byte[] b = new byte[1024]; 56 int len; 57 while((len = is.read(b)) != -1){ 58 fos.write(b, 0, len); 59 } 60 //4.“发送成功”的信息反馈给客户端 61 OutputStream os = s.getOutputStream(); 62 os.write("发送成功".getBytes()); 63 s.shutdownOutput(); 64 //5.关闭相应的流和socket 65 os.close(); 66 fos.close(); 67 is.close(); 68 s.close(); 69 ss.close(); 70 } 71 72 }
三、UDP传输文件实例:
1、发送端:
- 创建一个DatagramSocket的套接字对象
- 创建一个数据包
- 每个数据不能大于64k,
- 每一个都记录数据信息,发送端的IP,端口号以及发送到接收端的IP和端口号
3.发送数据包(报)
4.关闭DatagramSocket;
2、接收端:
1.创建一个DatagramSocket的套接字对象
2.创建一个数据包
3.接收数据
4.保存数据
5.socket
代码实现:
send()为发送端;accept为接收端;
import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import org.junit.Test; //关于UDP的编程实现,UDP(不可靠的传输,但是是最快的方式) public class TestUdp { @Test public void send() { DatagramSocket ds = null; try { ds = new DatagramSocket(); byte[] b = "我是要发送的数据".getBytes(); //创建一个数据报,每个数据不能大于64k,每一个都记录数据信息,发送端的IP,端口号以及发送到接收端的IP和端口号 DatagramPacket pack = new DatagramPacket(b, 0, b.length,InetAddress.getByName("127.0.0.1"),8989); ds.send(pack); ds.close(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ds != null){ ds.close(); } } } @Test public void accept(){ DatagramSocket ds=null; try { ds = new DatagramSocket(8989); byte[] b = new byte[1024]; DatagramPacket pack = new DatagramPacket(b, 0, b.length); ds.receive(pack); String str = new String (pack.getData(), 0, pack.getLength()); System.out.println(str); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ if(ds != null){ ds.close(); } } } }
测试时注意:先看服务端,再开客户端,否则传输失败,tcp传输还会报错;
博客园地址:https://www.cnblogs.com/lixiuming521125/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!