十五(二)、网络编程之通过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、发送端:

  1. 创建一个DatagramSocket的套接字对象
  2. 创建一个数据包
  • 每个数据不能大于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传输还会报错;

posted @ 2017-02-22 13:39  啄木鸟伍迪  阅读(1144)  评论(0编辑  收藏  举报
//火箭 GenerateContentList();