网络编程
一、通讯要素
①通讯要素1:IP 和 端口号
IP:InetAddress
端口号:标识正在计算机上运行的进程(程序)
不同的进程有不同的端口号,被规定为一个 16 位的整数 0~65535。
其中,0~1023被预先定义的服务通信占用(如MySql占用端口3306,http占用端口80等)。
除非我们需要访问这些特定服务,否则,就应该使用 1024~65535 这些端口中的某一个进行通信,以免发生端口冲突
socket:端口号与IP地址的组合得出一个网络套接字
InetAddress类
InetAddress类主要表示IP地址,两个子类:Inet4Address、Inet6Address
1)InetAddress类没有提供公共的构造器,而是提供了如下两个静态方法来获取InetAddress实例
InetAddress getByName(String host):在给定主机名的情况下确定主机的IP地址
InetAddress getByAddress(byte[] addr) :在给定原始IP地址的情况下,返回InetAddress对象
2)InetAddress提供了如下几个常用的方法
String getHostAddress() :返回IP地址字符串
String getHostName() :返回IP地址的主机名
InetAddress getLocalHost():返回本地主机
boolean isReachable(int timeout) :测试是否可以到达该地址,timeout为毫秒数
String getCanonicalHostName() :获取次IP地址的完全限定域名
②通讯要素2:网络通信协议
传输层协议中有两个非常重要的协议:
1)传输控制协议TCP(Transmission Control Protocol)
2)用户数据报协议UDP(User Datagram Protocol)。
TCP协议:
使用TCP协议前,须先建立TCP连接,形成传输数据通道
传输前,采用“三次握手”方式,是可靠的
TCP协议进行通信的两个应用进程:客户端、服务端
在连接中可进行大数据量的传输
传输完毕,需释放已建立的连接,效率低
UDP协议:
将数据、源、目的封装成数据包,不需要建立连接
每个数据报的大小限制在64K内
因无需连接,故是不可靠的
发送数据结束时无需释放资源,速度快
③基于Socket的TCP编程
Java语言的基于套接字编程分为服务端编程(ServerSocket)和客户端编程(Socket).
Socket类的常用方法
1)InetAddress getLocalAddress():返回对方Socket中的IP的InetAddress对象
2)int getLocalPort():返回本地Socket中的端口号
3)InetAddress getInetAddress():返回对方Socket中IP地址
4)int getPort():返回对方Socket中的端口号
5)void close() throws IOException:关闭Socket,不可在以后的网络连接中使用,除非创建新的套接字
6)InputStream getInputStream() throws IOException:获取与Socket相关联的字节输入流,用于从Socket中读数据
7)OutputStream getOutputStream() throws IOException:获取与Socket相关联的字节输出流,用于向Socket中写数据。
ServerSocket类的常用方法
1)Socket accept() throws IOException :等待客户端的连接请求,返回与该客户端进行通信用的Socket对象
2)void setSoTimeout(int timeout) throws SocketException :设置accept()方法等待连接的时间为timeout毫秒。
若时间已到,还没有客户端连接,则抛出InterruptedIOException异常,accept()方法不再阻塞,该倾听Socket可继续使用。
若timeout值为0,则表示accept()永远等待。该方法必须在倾听Socket创建后,在accept()之前调用才有效
3)void close()throws IOException:关闭监听Socket
4)InetAddress getInetAddress():返回此服务器套接字的本地地址
5)int getLocalPort():返回此套接字在其上监听的端口号
6)SocketAddress getLocalSocketAddress():返回此套接字绑定的端点的地址
④UDP网络通信
类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。
UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。
UDP协议中每个数据报都给出了完整的地址信息,因此无须建立发送方和接收方的连接
1)DatagramPacket:UDP数据报
DatagramPacket(byte[ ] data, int length)
DatagramPacket(byte[ ] data, int offset, int length)
DatagramPacket(byte[ ] data, int length, InetAddress remoteAddr, int remotePort)
DatagramPacket(byte[ ] data, int offset, int length, InetAddress remoteAddr, int remotePort)
DatagramPacket(byte[ ] data, int length, SocketAddress sockAddr)
DatagramPacket(byte[ ] data, int offset, int length, SocketAddress sockAddr)
以上构造函数都创建一个数据部分包含在指定的字节数组中的数据报文,
前两种形式的构造函数主要用来创建接收的端的DatagramPackets实例,
后四种形式主要用来创建发送端的DatagramPackets实例。
常用方法
InetAddress getAddress() :返回数据报中的Inetaddress对象
byte[] getData() :返回数据报中的数据
int getLength() :返回数据报中的数据的长度
int getPort() :返回数据报端口号
3)DatagramSocket:UDP数据报socket:发送和接受数据报
DatagramSocket()
DatagramSocket(int port)
常用方法
send(DatagramPacket p) :发送数据报
receive(DatagramPacket p) :接受数据报
⑤URL编程
类 URL 和 URLConnection 提供了最高级网络应用。URL 的网络资源的位置来同一表示 Internet 上各种网络资源。
通过URL对象可以创建当前应用程序和 URL 表示的网络资源之间的连接,这样当前程序就可以读取网络资源数据,或者把自己的数据传送到网络上去。
为了表示URL,java.net 中实现了类 URL。我们可以通过下面的构造器来初始化一个 URL 对象:
public URL (String spec):通过一个表示URL地址的字符串可以构造一个URL对象。例如:URL url = new URL ("http://www.atguigu.com/");
public URL(URL context, String spec):通过基 URL 和相对 URL 构造一个 URL 对象。例如:URL downloadUrl = new URL(url, “download.html")
public URL(String protocol, String host, String file); 例如:new URL("http", "www.atguigu.com", “download. html");
public URL(String protocol, String host, int port, String file); 例如: URL gamelan = new URL("http", "www.atguigu.com", 80, “download.html");
1)一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:
public String getProtocol( ):获取该URL的协议名
public String getHost( ):获取该URL的主机名
public String getPort( ):获取该URL的端口号
public String getPath( ):获取该URL的文件路径
public String getFile( ):获取该URL的文件名
public String getRef( ):获取该URL在文件中的相对位置
public String getQuery( ):获取该URL的查询名:例如?a=b,?后面是信息就是查询名
2)针对HTTP协议的URLConnection类
URL的方法 openStream():能从网络上读取数据
若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)
程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。
URLConnection:表示到URL所引用的远程对象的连接。当与一个URL建立连接时,首先要在一个 URL 对象上通过方法
openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.
URL netchinaren = new URL ("http://www.atguigu.com/index.shtml");
URLConnectonn u = netchinaren.openConnection( );
通过URLConnection对象获取的输入流和输出流,即可以与现有的CGI程序进行交互。
public Object getContent( ) throws IOException
public int getContentLength( )
public String getContentType( )
public long getDate( )
public long getLastModified( )
public InputStream getInputStream( )throws IOException
public OutputSteram getOutputStream( )throws IOException