java网络封包_java网络编程(套接字)

本文介绍了Java中的网络编程,主要讲解了TCP和UDP两种套接字的使用。通过示例代码展示了如何创建套接字、封包、发送和接收数据,以及端口号和IP地址的作用。在TCP中,数据传输可靠但效率较低,适用于文件传输;而UDP则是不可靠但高效,常用于直播等场景。
摘要由CSDN通过智能技术生成

套接字是java提供一套进行网络通信的API---TCP/UDP;

ISO七层模型

物理层 、数据链路层 、传输层-IP、 网络层-UDP/TCP 、会话层 、 表示层、 应用层---HTTP FTP POP3 SMTP...

IP地址:在网络中标识计算机地址的---IPv4---用四组整数(0-255)标识一个IP地址---123.125.43.11---IPv6

端口号: 用于指定接收或者发送消息的端口---0-65535---0-1024被计算机内部占用

UDP

基于流的,不需要建立连接,不可靠,会对数据进行封包,每个包是64k大小,传输效率是比较高。例如直播

java提供了一套套接字用于UDP通信:

1.InetSocketAddress("IP地址",端口号):表示IP地址和端口号;

2.DatgramSocket():用来发送和接收数据包的套接字;

3.DatagramPacket(byte[] buf, int length, SocketAddress address):用来对数据封包,以便传输;

发送端基本步骤:

1.创建发送数据套接字对象;

2.创建目的地的IP地址和发送端口;

3.将数据封包;

4.发送(send(DatagramPacket  dp)方法);

5.关闭套接字(close());

接收端基本步骤:

1.创建接收数据的套接字对象并绑定接收数据的端口;

2.创建数据封包用来储存数据;

3.接收数据(receive(DatagramPacket  dp));

4.关闭套接字(close());

1 importjava.net.DatagramPacket;2 importjava.net.DatagramSocket;3 importjava.net.InetSocketAddress;4 importjava.util.Scanner;5

6 public classUDPChatDemo {7

8 public static voidmain(String[] args) {9

10 new Thread(newSender()).start();11 new Thread(newReceiver()).start();12 }13

14 }15

16 //发送端

17 class Sender implementsRunnable {18

19 @SuppressWarnings("resource")20 @Override21 public voidrun() {22

23 try{24 //准备套接字对象

25 DatagramSocket ds = newDatagramSocket();26

27 //创建一个地址对象

28 InetSocketAddress isa = new InetSocketAddress("localhost", 9527);29

30 //从控制台来获取数据

31 Scanner s = newScanner(System.in);32

33 while (true) {34 String msg =s.nextLine();35

36 //将数据封包

37 DatagramPacket dp = newDatagramPacket(msg.getBytes(), msg.getBytes().length, isa);38

39 //发送数据

40 ds.send(dp);41

42 //判断这个语句是否是exit

43 if (msg == "exit" || msg != null && msg.equals("exit")) {44 break;45 }46 }47

48 } catch(Exception e) {49 e.printStackTrace();50 }51

52 }53

54 }55

56 class Receiver implementsRunnable {57

58 @SuppressWarnings("resource")59 @Override60 public voidrun() {61

62 try{63 //准备套接字对象,绑定端口号

64 DatagramSocket ds = new DatagramSocket(9527);65

66 //准备数据包

67 DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);68

69 while (true) {70

71 //接收数据

72 ds.receive(dp);73

74 //获取数据

75 String msg = new String(dp.getData(), 0, dp.getLength());76 if (msg == "exit" || msg != null && msg.equals("exit")) {77 break;78 }79

80 //获取地址

81 System.out.print(dp.getAddress() + ":");82 System.out.println(msg);83 }84

85 } catch(Exception e) {86 e.printStackTrace();87 }88

89 }90

91 }

TCP

基于流的,需要建立连接,经过了三次握手,理论上不限制数据的大小,传输速率比较低。例如文件的传输

java提供的套接字:

Socket:客户端套接字

ServerSocket:服务器端套接字

客户端基本步骤:

1.创建客户端套接字对象;

2.发起连接,并绑定连接地址;

3.获取输出流,写出数据;

4.通知服务器端数据写出完毕;

5.关闭套接字

1 importjava.io.InputStream;2 importjava.io.OutputStream;3 importjava.net.InetSocketAddress;4 importjava.net.Socket;5

6 public classTCPClientDemo2 {7

8 public static void main(String[] args) throwsException {9

10 //创建客户端的套接字

11 Socket s = newSocket();12

13 //发起连接,绑定端口号

14 s.connect(new InetSocketAddress("localhost", 8980));15

16 //获取输出流

17 OutputStream out =s.getOutputStream();18

19 //写出数据

20 out.write("我来啦啦啦~~~".getBytes());21

22 //关闭输出流

23 s.shutdownOutput();24

25 //获取输入流

26 InputStream in =s.getInputStream();27

28 //读取数据

29 byte[] bs = new byte[1024];30 int len = -1;31 while ((len = in.read(bs)) != -1) {32 System.out.println(new String(bs, 0, len));33 }34

35 //通知服务器端数据已经读取完毕

36 s.shutdownInput();37

38 //关闭套接字

39 s.close();40

41 }42

43 }

服务器端基本步骤:

1. 创建服务器端套接字,绑定端口号

2. 接受连接,获取到一个Socket对象

3. 获取输入流,读取数据

4. 通知客户端数据读取完毕

5. 关闭套接字

1 importjava.io.InputStream;2 importjava.net.ServerSocket;3 importjava.net.Socket;4

5 public classTCPServerDemo {6

7 public static void main(String[] args) throwsException {8

9 //创建一个服务器端套接字对象---绑定端口号

10 ServerSocket ss = new ServerSocket(9999);11

12 //接受连接

13 Socket s =ss.accept();14

15 //获取一个输入流

16 InputStream is =s.getInputStream();17

18 //读取数据

19 byte[] bs = new byte[1024];20 int len = -1;21 while ((len = is.read(bs)) != -1) {22 System.out.println(new String(bs, 0, len));23 }24

25 //通知客户端数据读取完毕

26 s.shutdownInput();27

28 //关闭套接字

29 s.close();30 ss.close();31

32 }33

34 }

注意:receive/connect/accept/read/write都会产生阻塞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值