黑马程序员——java语言基础部分——网络编程
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
InetAddress类
此类表示互联网协议 (IP) 地址。
IP 地址是 IP 使用的 32 位或 128 位无符号数字,它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。
全局 地址在 Internet 中是唯一的。
IP 地址的文本表示形式是特定于地址系列的。
InetAddress 类提供将主机名解析为其 IP 地址(或反之)的方法。
InetAddress 类具有一个缓存,用于存储成功及不成功的主机名解析。
获取InetAddress的实例对象:(该类没有构造函数只能通过静态方法来获取)
- static InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。
- static InetAddress getByAddress(byte[] addr) 在给定原始 IP 地址的情况下,返回 InetAddress 对象。
- static InetAddress getByAddress(String host, byte[] addr)根据提供的主机名和 IP 地址创建 InetAddress。
- static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
- static InetAddress getLocalHost() 返回本地主机。
- byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址。
- String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
- String toString() 将此 IP 地址转换为 String。
端口号:
用于标识进程的逻辑地址,不同进程的表示
有效端口:0~65535,其中0~1024系统使用或保留端口
传输协议:
通讯的规则:TCP、UDP
TCP协议
必须建立连接
三次握手完成连接,是可靠协议
速度慢
UDP协议
将数据及源和目的封装成数据包中,不需要建立连接
每个数据报的大小限制在64K内
协议不可靠
速度快
套接字
概述:
- 为网络服务提供的一种机制
- 通信的两端都有Socket
- 网路通信就是Socket间的通信
Socket类:套接字是两台机器间通信的端点。
套接字 DatagramSocket
此类表示用来发送和接收数据报包的套接字。
数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket 绑定到一个更加具体的地址时广播包也可以被接收。
发送和接收的套接字:
构造函数:
DatagramSocket() 构造数据报套接字并将其绑定到本地主机上任何可用的端口。
protected DatagramSocket(DatagramSocketImpl impl) 创建带有指定 DatagramSocketImpl 的未绑定数据报套接字。
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。
DatagramSocket(SocketAddress bindaddr) 创建数据报套接字,将其绑定到指定的本地套接字地址。
方法:
动作:
void bind(SocketAddress addr) 将此 DatagramSocket 绑定到特定的地址和端口。
void close() 关闭此数据报套接字。
void connect(InetAddress address, int port) 将套接字连接到此套接字的远程地址。
void connect(SocketAddress addr) 将此套接字连接到远程套接字地址(IP 地址 + 端口号)。
void disconnect() 断开套接字的连接。
void receive(DatagramPacket p) 从此套接字接收数据报包。
void send(DatagramPacket p) 从此套接字发送数据报包。
获取:
InetAddress getInetAddress() 返回此套接字连接的地址。
InetAddress getLocalAddress() 获取套接字绑定的本地地址。
int getLocalPort() 返回此套接字绑定的本地主机上的端口号。
SocketAddress getLocalSocketAddress() 返回此套接字绑定的端点的地址,如果尚未绑定则返回 null。
int getPort() 返回此套接字的端口。
判断:
boolean isBound() 返回套接字的绑定状态。
boolean isClosed() 返回是否关闭了套接字。
boolean isConnected() 返回套接字的连接状态。
数据报DatagramPacket
该类在UDP协议中使用,即用于客户端也用于服务端,表示数据报包。
数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
数据报包发送方:
构造函数:
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length, SocketAddress address) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
方法:
void setAddress(InetAddress iaddr) 设置要将此数据报发往的那台机器的 IP 地址。
void setData(byte[] buf) 为此包设置数据缓冲区。
void setData(byte[] buf, int offset, int length) 为此包设置数据缓冲区。
void setLength(int length) 为此包设置长度。
void setPort(int iport) 设置要将此数据报发往的远程主机上的端口号。
void setSocketAddress(SocketAddress address) 设置要将此数据报发往的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
数据报报接收方:
构造函数:
DatagramPacket(byte[] buf, int length) 构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int offset, int length) 构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。
发送方和接收方的共性方法:
InetAddress getAddress() 返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData() 返回数据缓冲区。
int getLength() 返回将要发送或接收到的数据的长度。
int getOffset() 返回将要发送或接收到的数据的偏移量。
int getPort() 返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
SocketAddress getSocketAddress() 获取要将此包发送到的或发出此数据报的远程主机的 SocketAddress(通常为 IP 地址 + 端口号)。
Socket和ServerSocket
TCP连接中,客户端是Socket,服务端是ServerSocket。两者之间传输是通过流来传输的。
- Socket()通过系统默认类型的 SocketImpl 创建未连接套接字
- Socket(InetAddress address, int port)创建一个流套接字并将其连接到指定 IP 地址的指定端口号。
- Socket(InetAddress address, int port, InetAddress localAddr, int localPort)创建一个套接字并将其连接到指定远程地址上的指定远程端口。
- Socket(Proxy proxy) 创建一个未连接的套接字并指定代理类型(如果有),该代理不管其他设置如何都应被使用。
- protected Socket(SocketImpl impl)使用用户指定的 SocketImpl 创建一个未连接 Socket。
- Socket(String host, int port)创建一个流套接字并将其连接到指定主机上的指定端口号。
- Socket(String host, int port, InetAddress localAddr, int localPort)创建一个套接字并将其连接到指定远程主机上的指定远程端口。
客户端套接字对象使用的方法:
- void bind(SocketAddress bindpoint) 将套接字绑定到本地地址。
- void close() 关闭此套接字。
- void connect(SocketAddress endpoint) 将此套接字连接到服务器。
- void connect(SocketAddress endpoint, int timeout) 将此套接字连接到服务器,并指定一个超时值。
- InetAddress getInetAddress() 返回套接字连接的地址。
- OutputStream getOutputStream() 返回此套接字的输出流。(客户端使用)
- InputStream getInputStream() 返回此套接字的输入流。(服务端使用)
获取客户端套接字的输出流,在流中写入数据。
服务端套接字ServerSocket
此类实现服务器套接字。服务器套接字等待请求通过网络传入。它基于该请求执行某些操作,然后可能向请求者返回结果。
创建服务端套接字对象:
- ServerSocket() 创建非绑定服务器套接字。
- ServerSocket(int port) 创建绑定到特定端口的服务器套接字。
- ServerSocket(int port, int backlog)利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。
- ServerSocket(int port, int backlog, InetAddress bindAddr)使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。
服务端套接字对象使用:
- Socket accept() 侦听并接受到此套接字的连接。
- void bind(SocketAddress endpoint) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
- void bind(SocketAddress endpoint, int backlog) 将 ServerSocket 绑定到特定地址(IP 地址和端口号)。
- void close() 关闭此套接字。
获取此连接的套接字后,用套接字来获取接收到的套接字的输入流,读出数据。
参考实现代码:
UDP协议的发送方和接收方的实现代码:
//发送方
//1,创建udp服务。通过DatagramSocket对象。
DatagramSocket ds = new DatagramSocket(8888);
//2,确定数据,并封装成数据包。DatagramPacket(byte[] buf, int length, InetAddress address, int port)
byte[] buf = "udp ge men lai le ".getBytes();
DatagramPacket dp =
new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);
//3,通过socket服务,将已有的数据包发送出去。通过send方法。
ds.send(dp);
//4,关闭资源。
ds.close();
//接收方
DatagramSocket ds = new DatagramSocket(10000);//定义接收方套接字
while(true)
{
//2,定义数据包。用于存储数据。
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf,buf.length);//定义接收方数据报包
//3,通过服务的receive方法将收到数据存入数据包中。
ds.receive(dp);//阻塞式方法。
//4,通过数据包的方法获取其中的数据。
String ip = dp.getAddress().getHostAddress();//获取ip地址
String data = new String(dp.getData(),0,dp.getLength());//获取数据报中数据
int port = dp.getPort();//获取数据报端口
System.out.println(ip+"::"+data+"::"+port);
}
//5,关闭资源
ds.close();
TCP协议的客户端和服务端的实现代码:
//客户端
Socket s = new Socket("192.168.1.254",10004);//建立客户端套接字
OutputStream out = s.getOutputStream();//发送数据
out.write("服务端,你好".getBytes());
InputStream in = s.getInputStream();//接收数据
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
s.close();
//服务端
ServerSocket ss = new ServerSocket(10004);//建立服务端套接字
Socket s = ss.accept();//执行accept方法成功后,连接才算成功,之后可以双方互发数据
String ip = s.getInetAddress().getHostAddress();//获取IP地址
InputStream in = s.getInputStream();//获取输入流,接收数据
byte[] buf = new byte[1024];
int len = in.read(buf);
System.out.println(new String(buf,0,len));
OutputStream out = s.getOutputStream();//获取输出流,发送数据
Thread.sleep(10000);
out.write("哥们收到,你也好".getBytes());
s.close();//关闭套接字
ss.close();//关闭套接字
总结:
1、TCP之间有连接,数据传输靠IO流
2、UDP之间无连接,数据传输用数据报
3、UDP传送数据较为麻烦,如果多次传输数据,需要多次send数据报,对方也是要多次receive数据报,速度虽快,却不可靠,因为对方接受可能不能一一对应。TCP连接之后,可以直接使用流来传送,速度虽慢,却可靠。
黑马程序员——java语言基础部分——网络编程相关推荐
- 黑马程序员--Java学习日记之网络编程
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.网络编程概述 1.计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及 ...
- 黑马程序员——Java语言基础——关键字、表示符、常量、变量及数据的类型、运算符
---------------------------- android培训.java培训.期待与您交流! --------------------------------- Java是强类型的语言, ...
- 黑马程序员——java语言基础——面向对象
---------------------- android培训.java培训.期待与您交流! ---------------------- 类就是:对现实生活中事物的描述. 对象:就是这类事物,实实 ...
- 黑马程序员——java语言基础——组合,关联,聚合的区别
类间关系 在类图中,除了需要描述单独的类的名称.属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义.在UML类图中,关系用类框之间的连 ...
- 黑马程序员C语言基础(第三天)
黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...
- 黑马程序员Java零基础视频教程_下部(P135-P200)
黑马程序员Java零基础视频教程_下部(P135-P200) 1 多线程 1.1 什么是多线程? 1.2 多线程的并发与并行 1.3 多线程的实现方式 1.3.1 继承Thread类的方式进行实现 1 ...
- 黑马程序员Java零基础视频教程_上部(P1-P80)
黑马程序员Java零基础视频教程_上部(P1-P80) 1. Java入门 1.1 Java学习介绍 1.2 Java人机交互 1.2.1 常用CMD命令 2. Java基础学习 2.1 Java入门 ...
- 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- 黑马程序员C语言基础(第七天)内存管理
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
最新文章
- java二级下拉菜单_航菜单栏中的二级下拉菜单
- 版权和许可协议的学习
- 手机控制树莓派linux,怎样用PC或手机远程控制树莓派
- 【Java集合系列】---ArrayList
- android 内部拦截,如何使用proxy,如何在内部拦截get方法
- 关于运行jar包时的一个错误
- 修改environment导致重启不能登录的问题解决
- VS2008无法识别的版本3.5
- SoapUI5.1.2安装和破解教程
- 关于起点中文网月票字体解密(附赠翻页获得月票)
- laravel 判断字符串包含_Laravel:表单验证字符串长度的错误信息导致的异常
- 快速批量创建文件夹的方法
- uniapp实现语音播放功能
- 公众号粉丝迁移需要多长时间?
- 优学院中国近现代史纲要试题及答案
- 使用 RSA 算法进行加解密,签名和验签
- 阳光下,我们是幸福的孩子
- android加固!渣本毕业两年经验,终局之战
- 13-JS中的面向对象
- WinRAR 被曝严重安全漏洞;苹果预计推出跨平台应用
热门文章
- 10个人用的云服务器要什么配置文件,10个人用的云服务器要什么配置文件
- Linux学习-49-列出进程调用或打开的文件信息(lsof命令)
- 电视剧《大秧歌》随感
- YOLOX的解耦头结构思考
- 怎么让电脑上的图片全屏显示呢
- Linux 下qW3xT.2,解决挖矿病毒
- CentOS 7.6的64位安装JAVA JDK
- C语言经典面试题 - 字母的大小写转化
- WCF,WPF,WWF 的新读音?WinCom, WinPrez, WinFlow
- Linux下快速解析nf_conntrack