Java中网络编程、TCP通信与UDP通信


根据上面 ServerSocket 对象可以实现服务端程序,此时还需要一个客户端程序与之交互,为此,Java JDK 提供了一个 Socket 类,用于实现 TCP 客户端程序。Socket 类同样提供了多种方法:

  • Socket(String host,int port):构造方法,创建 Socket 对象,会根据参数去连接在指定地址和端口上运行的服务器程序

  • Socket(InetAddress address,int port):构造方法,创建 Socket 对象,参数 address 用于接收一个 InetAddress 类型的对象,该对象用于封装一个 IP 地址

  • int getPort():返回一个 int 类型对象,该对象是 Socket 对象与服务器连接的端口号

  • InetAddress getLoclAddress():获取 Socket 对象绑定的本地 IP 地址,并将 IP 地址封装成 InetAddress 类型的对象返回

  • void close():关闭 Socket 连接,结束本次通信。在关闭 Socket 之前,应将与socket相关的所有输入/输出流全部关闭

  • InputStream getInputStream():返回一个 InputStream 类型的输入流对象,如果该对象是由服务器的 Socket 返回,就用于读取客户端发送的数据,反之,用于读取服务器端的数据

  • OutputStream getOutputStream():返回一个 OutputStream 类型的输出流对象,如果该对象是由服务器的 Socket 返回,就用于向客户端发送数据,反之,用于向服务器端发送数据

在 Socket 类的常用方法中,getInputStream() 和 getOutputStrea m() 方法分别用于获取输入流和输出流,当客户端和服务端建立连接后,数据是以 IO 流的形式进行交互的,从而实现通信。如图:

3、TCP 通信实例


服务器端实现:

  • 创建 ServerSocket 服务器对象

  • 开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

  • 给客户端反馈信息

/**

  • TCP 服务端

  • 1、创建ServerSocket服务器对象

  • 2、开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

  • 3、给客户端反馈信息

  • 3.1获取客户端的输出流

  • 3.2在服务端端,通过客户端的输出流写数据给客户端

*/

public static void main(String[] args) throws IOException {

//1、创建ServerSocket服务器对象

ServerSocket ser = new ServerSocket(8888);

//2、开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象

Socket soc = ser.accept();

//3、给客户端反馈信息

/*

  • a、获取客户端的输出流

  • b、在服务端端,通过客户端的输出流写数据给客户端

*/

//a、获取客户端的输出流

OutputStream OS = soc.getOutputStream();

//b、在服务端端,通过客户端的输出流写数据给客户端

OS.write(“恭喜你已连接上服务器!”.getBytes());

//4、关闭流资源

soc.close();

OS.close();

}

客户端实现:

  • 创建客户端Socket对象,(指定要连接的服务器地址与端口号)

  • 获取服务器端的反馈回来的信息

  • 关闭流资源

/**

  • TCP 客户端

  • 1、创建客户端Socket对象,(指定要连接的服务器地址与端口号)

  • 2、获取服务器端的反馈回来的信息

  • 3、关闭流资源

*/

public static void main(String[] args) throws IOException {

//获取本机 IP 地址字符串

String address = InetAddress.getLocalHost().getHostAddress();

System.out.println(address);

//1、创建客户端Socket对象,(指定要连接的服务器地址与端口号)

Socket socket = new Socket(address,8888);

//2、获取服务器端的反馈回来的信息

InputStream IS = socket.getInputStream();

//获取获取流中的数据

byte[] by = new byte[1024];

int length = IS.read(by);

//将流中的数据转换为字符串

String str = new String(by,0,length);

//显示数据

System.out.println(str);

//3、关闭流资源

IS.close();

socket.close();

}

四、UDP 通信

========

UDP 通信和 TCP 通信一样,都能实现两台计算机之间的通信,通信的两端都要创建 socket 对象,主要区别在于 UDP 中只有发送端和接收端,不分客户端和服务端,计算机之间可以任意的发送数据。在通信时发送端和接收端不用建立连接,为此,Java JDK 中提供了 DatagramPacket 类和 DatagramSocket 类来实现 UDP 通信。

1、DatagramPacket 类


DatagramPacket 类负责数据封装,就相当于一个集装箱,用于封装 UDP 通信中发送和接收的数据,在创建发送端和接收端 DatagramPacket  对象时,使用的构造方法有所不同:接收端不需要明确知道数据的来源,只需要接收到数据即可;而发送数据必须指定接收端的 IP 地址和端口号。

(1) 构造方法

  • DatagramPacket (byte[] buf,int length):接收端构造方法,接收一个字节数组来存放接收到的数据

  • DatagramPacket (byte[] buf,int length,InetAddress address,int port):发送端构造方法,接收存放发送数据的字节数组和指定发送端 IP 地址和端口号

(2) 常用方法

  • InetAddress getAddress():返回某台计算机的 IP 地址

  • int getPort():返回某台远程主机的端口号

  • byte[] getData():返回数据缓冲区

  • int getLength():返回将要发送或接收到的数据长度

2、DatagramSocket 类


DatagramSocket 类负责数据的收发,其实例化对象可以发送和接收 DatagramPacket 数据包,在创建发送端和接收端的 DatagramSocket 对象时,使用的构造方法也有所不同

(1) 构造方法

  • DatagramSocket():没有指定端口号,系统会分配一个没有被其它网络程序所使用的端口号

  • DatagramSocket(int port):指定一个端口号创建对象,可以监听指定的端口

(2) 常用方法

  • void receive(DatagramSocket p):从此套接字接收数据包

  • void send(DatagramSocket p):从此套接字发送数据包

3、UDP 通信实例


UDP 通信的实现需要创建一个发送端程序和一个接收端程序,在通信时只有先接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失,因此要先完成接收端程序的编写

发送端:

  • 创建 DatagramPacket 对象,并封装数据

  • 创建 DatagramSocket 对象

  • 调用 DatagramSocket 对象方法 send() 发送数据

  • 释放流资源

/**

  • 发送端

  • 1, 创建DatagramPacket对象,并封装数据

  • 2,创建DatagramSocket对象

  • 3,发送数据

  • 4,释放流资源

*/

public static void main(String[] args) throws IOException {

//1,创建DatagramPacket对象,并封装数据

byte[] buf = “接收端你好,我是发送端!”.getBytes();

//1.1创建InetAddress对象,封装自己的IP地址

InetAddress Inet = InetAddress.getByName(“192.168.161.1”);

DatagramPacket DP = new DatagramPacket(buf,buf.length, Inet,8888);

//2, 创建DatagramSocket对象

DatagramSocket DS = new DatagramSocket();

//3,发送数据

DS.send(DP);

//4,释放流资源

DS.close();

}

接收端:

  • 创建 DatagramSocket 对象,绑定端口号(和发送端一直)

  • 创建字节数组,接收发来的数据

  • 创建数据包 DatagramPacket 对象

  • 调用 DatagramSocket 对象方法 receive(DatagramPacket DP) 接收数据

  • 获取 DatagramPacket 对象内容:拆包

发送的 IP 地址

接收到的字节内容及个数

发送端的端口号

  • 释放流资源

/**

  • UDP接收端

  • 1,创建DatagramSocket对象

  • 2,创建DatagramPacket对象

  • 3,接收数据存储到DatagramPacket对象中

  • 4,获取DatagramPacket对象的内容

  • 5,释放流资源

*/

public static void main(String[] args) throws IOException {

//1,创建DatagramSocket对象

DatagramSocket DS = new DatagramSocket(8888);

//2,创建DatagramPacket对象

byte[] buffer = new byte[1024];

DatagramPacket DP = new DatagramPacket(buffer,1024);

//3,调用 DatagramSocket 对象方法 receive(DatagramPacket DP) 接收数据

DS.receive(DP);

//4,获取DatagramPacket对象的内容进行拆包

InetAddress ipAddress = DP.getAddress();

System.out.println(ipAddress);

//获取发送的 IP 地址

String IP = ipAddress.getHostAddress();

//接收到的字节内容及个数
先自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以扫码领取!

img

最后如何让自己一步步成为技术专家

说句实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。

当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。

推荐一份Java架构之路必备的学习笔记,内容相当全面!!!

成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。

你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!

进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

【关注】+【转发】+【点赞】支持我!创作不易!
实话,如果一个打工人不想提升自己,那便没有工作的意义,毕竟大家也没有到养老的年龄。

当你的技术在一步步贴近阿里p7水平的时候,毫无疑问你的薪资肯定会涨,同时你能学到更多更深的技术,交结到更厉害的大牛。

推荐一份Java架构之路必备的学习笔记,内容相当全面!!!

[外链图片转存中…(img-KRfc7846-1711378152118)]

成年人的世界没有容易二字,前段时间刷抖音看到一个程序员连着加班两星期到半夜2点的视频。在这个行业若想要拿高薪除了提高硬实力别无他法。

你知道吗?现在有的应届生实习薪资都已经赶超开发5年的程序员了,实习薪资26K,30K,你没有紧迫感吗?做了这么多年还不如一个应届生,真的非常尴尬!

进了这个行业就不要把没时间学习当借口,这个行业就是要不断学习,不然就只能被裁员。所以,抓紧时间投资自己,多学点技术,眼前困难,往后轻松!

【关注】+【转发】+【点赞】支持我!创作不易!
需要更多Java资料的小伙伴可以帮忙点赞+关注,点击传送门,即可免费领取!

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值