失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 黑马程序员——java语言基础部分——网络编程

黑马程序员——java语言基础部分——网络编程

时间:2019-09-11 15:04:44

相关推荐

黑马程序员——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:此类实现客户端套接字(也可以就叫“套接字”)。建立客户端套接字对象: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语言基础部分——网络编程》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。