------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:
     此类实现客户端套接字(也可以就叫“套接字”)。
     建立客户端套接字对象:
  • 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语言基础部分——网络编程相关推荐

  1. 黑马程序员--Java学习日记之网络编程

     ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.网络编程概述 1.计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及 ...

  2. 黑马程序员——Java语言基础——关键字、表示符、常量、变量及数据的类型、运算符

    ---------------------------- android培训.java培训.期待与您交流! --------------------------------- Java是强类型的语言, ...

  3. 黑马程序员——java语言基础——面向对象

    ---------------------- android培训.java培训.期待与您交流! ---------------------- 类就是:对现实生活中事物的描述. 对象:就是这类事物,实实 ...

  4. 黑马程序员——java语言基础——组合,关联,聚合的区别

    类间关系 在类图中,除了需要描述单独的类的名称.属性和操作外,我们还需要描述类之间的联系,因为没有类是单独存在的,它们通常需要和别的类协作,创造比单独工作更大的语义.在UML类图中,关系用类框之间的连 ...

  5. 黑马程序员C语言基础(第三天)

    黑马程序员C语言基础(一)第三天 https://www.bilibili.com/video/BV15W411K7k6?p=40 文章目录 低级语言与高级语言 c语言优缺点 c语言应用领域 通过gc ...

  6. 黑马程序员Java零基础视频教程_下部(P135-P200)

    黑马程序员Java零基础视频教程_下部(P135-P200) 1 多线程 1.1 什么是多线程? 1.2 多线程的并发与并行 1.3 多线程的实现方式 1.3.1 继承Thread类的方式进行实现 1 ...

  7. 黑马程序员Java零基础视频教程_上部(P1-P80)

    黑马程序员Java零基础视频教程_上部(P1-P80) 1. Java入门 1.1 Java学习介绍 1.2 Java人机交互 1.2.1 常用CMD命令 2. Java基础学习 2.1 Java入门 ...

  8. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  9. 黑马程序员C语言基础(第七天)内存管理

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

最新文章

  1. java二级下拉菜单_航菜单栏中的二级下拉菜单
  2. 版权和许可协议的学习
  3. 手机控制树莓派linux,怎样用PC或手机远程控制树莓派
  4. 【Java集合系列】---ArrayList
  5. android 内部拦截,如何使用proxy,如何在内部拦截get方法
  6. 关于运行jar包时的一个错误
  7. 修改environment导致重启不能登录的问题解决
  8. VS2008无法识别的版本3.5
  9. SoapUI5.1.2安装和破解教程
  10. 关于起点中文网月票字体解密(附赠翻页获得月票)
  11. laravel 判断字符串包含_Laravel:表单验证字符串长度的错误信息导致的异常
  12. 快速批量创建文件夹的方法
  13. uniapp实现语音播放功能
  14. 公众号粉丝迁移需要多长时间?
  15. 优学院中国近现代史纲要试题及答案
  16. 使用 RSA 算法进行加解密,签名和验签
  17. 阳光下,我们是幸福的孩子
  18. android加固!渣本毕业两年经验,终局之战
  19. 13-JS中的面向对象
  20. WinRAR 被曝严重安全漏洞;苹果预计推出跨平台应用

热门文章

  1. 10个人用的云服务器要什么配置文件,10个人用的云服务器要什么配置文件
  2. Linux学习-49-列出进程调用或打开的文件信息(lsof命令)
  3. 电视剧《大秧歌》随感
  4. YOLOX的解耦头结构思考
  5. 怎么让电脑上的图片全屏显示呢
  6. Linux 下qW3xT.2,解决挖矿病毒
  7. CentOS 7.6的64位安装JAVA JDK
  8. C语言经典面试题 - 字母的大小写转化
  9. WCF,WPF,WWF 的新读音?WinCom, WinPrez, WinFlow
  10. Linux下快速解析nf_conntrack