当前位置:   article > 正文

【JavaSE】Java基础语法(四十五):TCP UDP 全解_java tcp和udp详解

java tcp和udp详解




在这里插入图片描述

1. TCP发送数据

  • Java中的TCP通信

    • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。
    • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类
  • 构造方法
    在这里插入图片描述

  • 相关方法
    在这里插入图片描述

  • 示例代码

public class ClientDemo {
	public static void main(String[] args) throws IOException {
		//创建客户端的Socket对象(Socket)
		//Socket(String host, int port) 创建流套接字并将其连接到指定主机上的指定端口号
		Socket s = new Socket("127.0.0.1",10000);
		//获取输出流,写数据
		//OutputStream getOutputStream() 返回此套接字的输出流
		OutputStream os = s.getOutputStream();
		os.write("hello,tcp,我来了".getBytes());
		//释放资源
		s.close();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

2. TCP接收数据【应用】

  • 构造方法: 创建绑定到指定端口的服务器套接字
ServletSocket(int port)
  • 1
  • 相关方法:监听要连接到此的套接字并接受它
Socket accept() 
  • 1
  • 注意事项

    1. accept方法是阻塞的,作用就是等待客户端连接
    2. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接
    3. 针对客户端来讲,是往外写的,所以是输出流
      针对服务器来讲,是往里读的,所以是输入流
    4. read方法也是阻塞的
    5. 客户端在关流的时候,还多了一个往服务器写结束标记的动作
    6. 最后一步断开连接,通过四次挥手协议保证连接终止

  • 三次握手和四次挥手

    • 三次握手
    • 四次挥手

3. TCP程序练习

案例需求
客户端:发送数据,接受服务器反馈
服务器:收到消息后给出反馈

案例分析
客户端创建对象,使用输出流输出数据
服务端创建对象,使用输入流接受数据
服务端使用输出流给出反馈数据
客户端使用输入流接受反馈数据

代码实现

// 客户端
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",10000);
		OutputStream os = socket.getOutputStream();
		os.write("hello".getBytes());
		// os.close();如果在这里关流,会导致整个socket都无法使用
		socket.shutdownOutput();//仅仅关闭输出流.并写一个结束标记,对socket没有任何
		影响
		BufferedReader br = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
		String line;
		while((line = br.readLine())!=null){
			System.out.println(line);
		}
		br.close();
		os.close();
		socket.close();
	}
}

// 服务器
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket accept = ss.accept();
		InputStream is = accept.getInputStream();
		int b;
		while((b = is.read())!=-1){
			System.out.println((char) b);
		}
		System.out.println("看看我执行了吗?");
		BufferedWriter bw = new BufferedWriter(new
		OutputStreamWriter(accept.getOutputStream()));
		bw.write("你谁啊?");
		bw.newLine();
		bw.flush();
		bw.close();
		is.close();
		accept.close();
		ss.close();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

4. TCP程序文件上传练习【应用】

案例需求
客户端:数据来自于本地文件,接收服务器反馈
服务器:接收到的数据写入本地文件,给出反馈

案例分析
- 创建客户端对象,创建输入流对象指向文件,每读一次数据就给服务器输出一次数据,输出
结束后使用shutdownOutput()方法告知服务端传输结束
- 创建服务器对象,创建输出流对象指向文件,每接受一次数据就使用输出流输出到文件中,
传输结束后。使用输出流给客户端反馈信息
- 客户端接受服务端的回馈信息

相关方法
在这里插入图片描述

代码实现

// 客户端
public class ClientDemo {
	public static void main(String[] args) throws IOException {
		Socket socket = new Socket("127.0.0.1",10000);
		//是本地的流,用来读取本地文件的.
		BufferedInputStream bis = new BufferedInputStream(new
		FileInputStream("socketmodule\\ClientDir\\1.jpg"));
		//写到服务器 --- 网络中的流
		OutputStream os = socket.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(os);
		int b;
		while((b = bis.read())!=-1){
			bos.write(b);//通过网络写到服务器中
		}
		bos.flush();
		//给服务器一个结束标记,告诉服务器文件已经传输完毕
		socket.shutdownOutput();
		BufferedReader br = new BufferedReader(new
		InputStreamReader(socket.getInputStream()));
		String line;
		while((line = br.readLine()) !=null){
			System.out.println(line);
		}
		bis.close();
		socket.close();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
// 服务器
public class ServerDemo {
	public static void main(String[] args) throws IOException {
		ServerSocket ss = new ServerSocket(10000);
		Socket accept = ss.accept();
		//网络中的流,从客户端读取数据的
		BufferedInputStream bis = new
		BufferedInputStream(accept.getInputStream());
		//本地的IO流,把数据写到本地中,实现永久化存储
		BufferedOutputStream bos = new BufferedOutputStream(new
		FileOutputStream("socketmodule\\ServerDir\\copy.jpg"));
		int b;
		while((b = bis.read()) !=-1){
			bos.write(b);
		}
		BufferedWriter bw = new BufferedWriter(new
		OutputStreamWriter(accept.getOutputStream()));
		bw.write("上传成功");
		bw.newLine();
		bw.flush();
		bos.close();
		accept.close();
		ss.close();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

5. UDP发送数据

  • Java中的UDP通信

    • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个
      Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客
      户端和服务器的概念
    • Java提供了DatagramSocket类作为基于UDP协议的Socket
  • 构造方法
    在这里插入图片描述

  • 相关方法
    在这里插入图片描述

  • 发送数据的步骤
    - 创建发送端的Socket对象(DatagramSocket)
    - 创建数据,并把数据打包
    - 调用DatagramSocket对象的方法发送数据
    - 关闭发送端

  • 代码演示

    public class SendDemo {
    	public static void main(String[] args) throws IOException {
    		//创建发送端的Socket对象(DatagramSocket)
    		// DatagramSocket() 构造数据报套接字并将其绑定到本地主机上的任何可用端口
    		DatagramSocket ds = new DatagramSocket();
    		//创建数据,并把数据打包
    		//DatagramPacket(byte[] buf, int length, InetAddress address, int port)
    		//构造一个数据包,发送长度为 length的数据包到指定主机上的指定端口号。
    		byte[] bys = "hello,udp,我来了".getBytes();
    		DatagramPacket dp = new
    		DatagramPacket(bys,bys.length,InetAddress.getByName("127.0.0.1"),10086);
    		//调用DatagramSocket对象的方法发送数据
    		//void send(DatagramPacket p) 从此套接字发送数据报包
    		ds.send(dp);
    		//关闭发送端
    		//void close() 关闭此数据报套接字
    		ds.close();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

6. UDP接收数据【应用】

  • 接收数据的步骤

    • 创建接收端的Socket对象(DatagramSocket)
    • 创建一个数据包,用于接收数据
    • 调用DatagramSocket对象的方法接收数据
    • 解析数据包,并把数据在控制台显示
    • 关闭接收端
  • 构造方法
    在这里插入图片描述

  • 相关方法
    在这里插入图片描述

  • 示例代码

    public class ReceiveDemo {
    	public static void main(String[] args) throws IOException {
    		//创建接收端的Socket对象(DatagramSocket)
    		DatagramSocket ds = new DatagramSocket(12345);
    		//创建一个数据包,用于接收数据
    		byte[] bys = new byte[1024];
    		DatagramPacket dp = new DatagramPacket(bys, bys.length);
    		//调用DatagramSocket对象的方法接收数据
    		ds.receive(dp);
    		//解析数据包,并把数据在控制台显示
    		System.out.println("数据是:" + new String(dp.getData(), 0,
    		dp.getLength()));
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

7. UDP通信程序练习【应用】

  • 案例需求

    • UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束
    • UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收
  • 代码实现

    /*
    	UDP发送数据:
    	数据来自于键盘录入,直到输入的数据是886,发送数据结束
    */
    public class SendDemo {
    	public static void main(String[] args) throws IOException {
    		//创建发送端的Socket对象(DatagramSocket)
    		DatagramSocket ds = new DatagramSocket();
    		//键盘录入数据
    		Scanner sc = new Scanner(System.in);
    		while (true) {
    			String s = sc.nextLine();
    			//输入的数据是886,发送数据结束
    			if ("886".equals(s)) {
    				break;
    			}
    			//创建数据,并把数据打包
    			byte[] bys = s.getBytes();
    			DatagramPacket dp = new DatagramPacket(bys, bys.length,
    			InetAddress.getByName("192.168.1.66"), 12345);
    			//调用DatagramSocket对象的方法发送数据
    			ds.send(dp);
    		}
    		//关闭发送端
    		ds.close();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    /*
    	UDP接收数据:
    	因为接收端不知道发送端什么时候停止发送,故采用死循环接收
    */
    public class ReceiveDemo {
    	public static void main(String[] args) throws IOException {
    		//创建接收端的Socket对象(DatagramSocket)
    		DatagramSocket ds = new DatagramSocket(12345);
    		while (true) {
    			//创建一个数据包,用于接收数据
    			byte[] bys = new byte[1024];
    			DatagramPacket dp = new DatagramPacket(bys, bys.length);
    			//调用DatagramSocket对象的方法接收数据
    			ds.receive(dp);
    			//解析数据包,并把数据在控制台显示
    			System.out.println("数据是:" + new String(dp.getData(), 0,
    			dp.getLength()));
    		}
    		//关闭接收端
    		// ds.close();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

8. UDP三种通讯方式

  • 单播
    单播用于两个主机之间的端对端通信
  • 组播
    组播用于对一组特定的主机进行通信
  • 广播
    广播用于一个主机对整个局域网上所有主机上的数据通信



在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/704299
推荐阅读
相关标签
  

闽ICP备14008679号