UDP协议&TCP协议
域名:
DN (Domain name)是由一串由点分隔的名字组成的Internet上某一台计算机或计算机组的名称。
域名服务系统:DNS:它可以作为将域名和IP地址相互映射的一个分布式数据库。
协议:
应用层常见协议:
http协议:超文本传输语言。
ftp协议:文件传输协议
smtp协议:简单邮件传输协议
传输层的协议:
UDP协议:用户数据报协议,面向无连接的,简单不可靠的传输层协议。
- 面向无连接
- 通过数据报包来进行传输,每个数据报包大小不会超过64k.
- 不可靠的传输。
- 传输速度快。
TCP协议:传输控制协议,一种面向连接的,可靠的,基于字节流的传输层通信协议。
TCP协议传输过程:
要经过三次握手,确定通道的连接。
建立流的传输通道,进行数据的传输。
TCP传输协议的特点:
- 面向连接的
- 通过流通道进行数据的传输
- 可靠的连接
- 速度慢
UDP协议传输
代码示例:
发送端:
1 /** 2 3 1. 发送数据报包 4 ① 创建发送端的套接字对象。 5 ② 打包数据,用的 DatagramPacket 6 DatagramPacket(byte[] buf, int length, InetAddress address, int port) 7 ③ 发送 8 send(dp) 9 ④ 关闭资源 10 close 11 */ 12 public class 发送端 { 13 public static void main(String[] args) throws IOException, UnknownHostException { 14 // ① 创建发送端的套接字对象。 15 DatagramSocket ds=new DatagramSocket(); 16 String s=" 接收端您好 "; 17 byte[] buf=s.getBytes(); 18 DatagramPacket dp=new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 9000); 19 // 发送 20 ds.send(dp); 21 // 等待接收端的响应 --> 接收端 22 // 空的数据报包接收 23 byte[] buf1=new byte[1024]; 24 DatagramPacket dp1=new DatagramPacket(buf1, buf1.length); 25 ds.receive(dp1); 26 // 显示 27 System.out.println(new String(dp1.getData())); 28 ds.close(); 29 } 30 }
接收端:
1 /** 2 . 用来接收数据报包 3 ① 创建一个接收数据的套接字。 4 ② 创建一个空的数据报包来接收数据 5 ③ 接收 receive(DatagramPacket p) 6 ④ 关闭 7 */ 8 public class 接收端 { 9 public static void main(String[] args) throws IOException { 10 // ① 创建一个接收数据的套接字。 11 DatagramSocket ds=new DatagramSocket(9000); 12 // ② 创建一个空的数据报包来接收数据 13 // DatagramPacket(byte[] buf, int length) 14 byte[] buf=new byte[1024]; 15 DatagramPacket dp=new DatagramPacket(buf, buf.length); 16 // 接收 17 ds.receive(dp); 18 // 显示 getLength 返回接收到的数据的字节长度 19 System.out.println(new String(buf,0,dp.getLength())); 20 // 发送端响应 -- 》发送端 21 //getAddress/getPort 获取发送端的 ip 地址与端口号 22 DatagramPacket p=new DatagramPacket(" 发送端您好 ".getBytes(), " 发送端您好 ".getBytes().length, d 23 p.getAddress(), dp.getPort()); 24 ds.send(p); 25 // 关闭 26 ds.close(); 27 } 28 }
TCP协议传输
代码示例:
服务器端代码:
1 package DemoEE; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.net.ServerSocket; 6 import java.net.Socket; 7 8 public class 服务器端3 { 9 10 public static void main(String[] args) throws IOException { 11 System.out.println("正在等待客户端连接"); 12 ServerSocket ss=new ServerSocket(9004); 13 Socket s=ss.accept(); 14 InputStream is=s.getInputStream(); 15 byte[] bt=new byte[1024]; 16 int count=0; 17 while((count=is.read(bt))!=-1) { 18 System.out.println(new String(bt,0,count)); 19 } 20 } 21 }
客户端代码:
1 package DemoEE; 2 3 import java.io.IOException; 4 import java.io.OutputStream; 5 import java.net.InetAddress; 6 import java.net.Socket; 7 8 public class 客户端3 { 9 10 public static void main(String[] args) throws IOException, IOException { 11 Socket s=new Socket(InetAddress.getByName("localhost"),9004); 12 OutputStream os=s.getOutputStream(); 13 os.write(new String("服务器端你好").getBytes()); 14 os.close(); 15 s.close(); 16 17 } 18 }
先执行服务器端,执行效果:
执行客户端,执行效果:
代码示例二:
服务器端:
1 /** 2 3 1. 创建服务器端的对象: 在指定端口监听是否有客户端进行连接。 4 2. 通过 accept 方法进行监听,并通过三次握手建立连接流通道。 5 3. 从客户端读取内容,获取流通道中的输入流 6 4. 关闭资源 7 */ 8 public class 服务器端 { 9 public static void main(String[] args) throws IOException { 10 // 1. 创建服务器端的对象: 在指定端口监听是否有客户端进行连接。 11 ServerSocket ss=new ServerSocket(9000); 12 //2. 通过 accept 方法进行监听,并通过三次握手建立连接流通道。 13 // 返回值为当前要连接的客户端对象 14 System.out.println(" 等待客户端的连接。。。。 "); 15 Socket s=ss.accept(); 16 //3. 从客户端读取内容,获取流通道中的输入流 17 InputStream is = s.getInputStream(); 18 // 读取 19 byte[] b=new byte[1024]; 20 int count=0; 21 while((count=is.read(b))!=-1) { 22 System.out.println(new String(b,0,count)); 23 } 24 // 关闭资源 25 is.close(); 26 ss.close(); 27 } 28 }
客户端:
1 /** 2 3 1. 创建客户端的对象: 指定服务器,服务器的端口 4 2. 向服务器端写入,获取流通道中的输出流 5 3. 关闭资源 6 */ 7 public class 客户端 { 8 public static void main(String[] args) throws IOException { 9 // 1. 创建客户端的对象: 指定服务器,服务器的端口 10 Socket s=new Socket(InetAddress.getByName("localhost"), 9000); 11 // 2. 向服务器端写入,获取流通道中的输出流 12 OutputStream os = s.getOutputStream(); 13 os.write(" 服务器端您好 ".getBytes()); 14 // 关闭资源 15 os.close(); 16 s.close(); 17 } 18 }
代码示例三:
进阶班客户端:
1 package com.tcp2; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.InputStreamReader; 5 import java.io.OutputStream; 6 import java.io.OutputStreamWriter; 7 import java.net.InetAddress; 8 import java.net.Socket; 9 /** 10 11 1. 客户端 12 */ 13 public class 客户端 { 14 public static void main(String[] args) { 15 // 客户端对象 16 try(Socket client=new Socket(InetAddress.getByName("localhost"), 9000); 17 // 用户输入 18 BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 19 // 向服务器端发送信息,输出流 20 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 21 // 读取从服务器写入的内容 输入流 22 BufferedReader bre=new BufferedReader(new InputStreamReader(client.getInputStream())); 23 ){ 24 System.out.println(" 客户端要发送到服务器端的内容为: "); 25 // 通过用户输入信息 26 String msg = br.readLine(); 27 // 将用户输入的信息发送到服务器端 28 bw.write(msg); 29 // 换行的标识 30 bw.newLine(); 31 // 刷新缓冲区 32 bw.flush(); 33 // 等待接收 34 String msgServer = bre.readLine(); 35 System.out.println(" 从服务器获取的信息: "+msgServer); 36 }catch (Exception e) { 37 e.printStackTrace(); 38 } 39 } 40 }
进阶版服务器端:
1 package com.tcp2; 2 import java.io.BufferedReader; 3 import java.io.BufferedWriter; 4 import java.io.InputStreamReader; 5 import java.io.OutputStreamWriter; 6 import java.net.ServerSocket; 7 import java.net.Socket; 8 /** 9 10 1. 服务器端 11 */ 12 public class 服务器端 { 13 public static void main(String[] args) { 14 // 服务器 15 try(ServerSocket ss=new ServerSocket(9000);){ 16 System.out.println(" 等待客户端的连接。。。。。 "); 17 // 连接每一个客户端 18 try(Socket client=ss.accept(); 19 // 读取客户端发送的信息 20 BufferedReader br=new BufferedReader(new InputStreamReader(client.getInputStream())); 21 // 获取服务器端用户输入的信息 22 BufferedReader bin=new BufferedReader(new InputStreamReader(System.in)); 23 // 向客户端写入信息 24 BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 25 ){ 26 // 读取客户端发来的信息 27 String clientMsg = br.readLine(); 28 System.out.println(" 从客户端发来的消息为: "+clientMsg); 29 System.out.println(" 服务器端要发送到客户端的内容为: "); 30 // 服务器端用户输入信息 31 String input = bin.readLine(); 32 // 向客户端写入 33 bw.write(input); 34 bw.newLine(); 35 bw.flush(); 36 }catch (Exception e) { 37 e.printStackTrace(); 38 } 39 }catch (Exception e) { 40 e.printStackTrace(); 41 } 42 } 43 }