java基础_网络编程
1,网络模型
1.1网络模型示意图
1.2网络模型说明:
(1)数据的传输:在用户端,应用层的数据,经过层层封包,最后到物理层,通过网络发送到网络的另一端,再从物理层到应用层进行层层解包。
(2)常用层的协议,包括:应用层的FTP和HTTP协议等;传输层的UDP和TCP等;网际层的IP等。
(3)对于开发者来讲,一般处于传输层和网际层。对于用户,通常停留在应用层。
2,网络通讯要素
ip地址,端口号,传输协议
1,ip地址
1.1,IP地址概述
(1)IP地址用于唯一地表示网络中的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口.
(2)ip地址如同我们写一封信,要表明收信人的通信地址和发信人的地址,然后邮政人员通过地址来决定信的去向,而在基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。
(3)ip地址被分成了A,B,C,D,E五类,每个类别的网络标识和主机标识各有规则
A:10.0.0.0-10.255.255.255
B:172.16.0.0-172.31.255.255
C:192.168.0.0-192.168.255.255
1.2,ip地址对象
java提供了InetAddress类来代表IP地址。
InetAddress类没有构造器,而是提供了如下方法来获取InetAddress对象。
1,static InetAddress getByName(String host): 根据主机名返回InetAddress对象
2,static InetAddress getByAddress(byte[] addr):给定原始ip地址的情况下,返回InetAddress对象
3,static InetAddress getLocalHost() :返回本地主机
InetAddress还提供了方法获取InetAddress实例对应的IP地址和主机名
1,Stirng getHostAddress():返回ip地址字符串
2,String getHostName():获取此ip地址的主机名
class IPDemo { public static void main(String[] args) throws Exception { InetAddress i = InetAddress.getLocalHost();//获取本地主机 System.out.println(i.toString());//ZGC-SDFSDF/58.195.50.196 System.out.println("address:"+i.getHostAddress()); //58.195.50.196 //static 主机名InetAddress getByName(String host) //在给定的情况下确定主机的 IP 地址。 InetAddress ia = InetAddress.getByName("www.baidu.com"); System.out.println("address:"+ia.getHostAddress());//119.75.217.56 System.out.println("name:"+ia.getHostName());//www.baodi.com } }
2,端口号
(1)端口是一个16位的整数,用于表示数据交给哪些通信程序处理。
(2)有效端口:0 ~65535,其中0~ 1024是系统使用或保留的端口。
(3)如果把ip地址理解为某个人所在地方的地址()包括街道和门牌号,但仅有地址还是找不到这个人,还需要知道他所在的房号才可以找到这个人。而当一个
程序需要发送数据时,需要指定目的地址的IP地址和端口,计算机就可以将数据送给该IP地址和端口号所对应的程序。
3,网络协议
3.1,UDP协议
UDP协议:是面向无连接,明确了对方的端口,无论在不在网上,只管传输,不在就会丢失数据。只求速度,应用于网络视频会议和聊天等应用程序中。其特点有:
(1)将数据和源、目的封装成包,不需要建立链接;
(2)每个数据包的大小限制在64K之内;
(3)因无连接,是不可靠的协议;
(4)不需建立连接,速度快;
3.2,TCP协议
TCP协议:是面向连接的,必须连接成功才能传输数据,应用于下载等程序上。其特点是:
(1)建立连接,形成传输数据通道;
(2)在连接中进行大数据量传输;
(3)通过三次握手完成连接,是可靠的协议;
(4)必须建立连接,效率会低一些;
3,网络编程
3.1基于UDP协议的网络编程
UDP协议的主要作用是完成网络数据流和数据报之间的转换-在信息的发送端,UDP协议将网络数据流封装成数据报,然后将数据报发送出去;
在信息的接收端,UDP协议将数据报转换成实际数据内容。
3.1.1使用DatagramSocket发送,接收数据
java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,
DatagramSocket的一些方法
构造函数
1,DatagramSocket():
2,DatagramSocket(int port):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址,指定端口
3,DatagramSocket(int port,InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址,指定端口
常用方法
1,void close():关闭数据报套接字
2,InetAddress getInetAddress():返回此套接字连接的地址
3,int getPort():返回此套接字的端口
4,void receive(DatagramPacket p):从此套接字发送数据报包
5,void send(DatagramPacket p):从此套接字发送数据包。
3.1.2,DatagramPacket类表示数据包
java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成。
DatagramPacket的一些方法
构造函数
1,DatagramPacket(byte[] buf,int length):构造用来接收长度为length的数据包
2,DatagramPacket(byte[] buf,int length,InetAddress address,int port):构造数据包,用来将长度为length的包发送到指定主机上的指定端口
常用方法
1,InetAddress getAddress():返回指定机器的IP地址
2,byte[] getData():返回数据缓冲区
3,int getLength():返回要发送或接收的数据长度
4,int getPort():返回端口号
3.1.3,udp发送端
1,建立udpsocket服务。通常会监听一个端口,其实就是给这个接收网络应用程序定义数据标识,
方便于明确那些数据过来,该应用程序可以处理。
2,提供数据,并将数据封装到数据包中。
3,通过socket服务的发送功能,将数据包发出去。
4,关闭资源。
class UdpSend { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); byte[] buf = "udp ge men lai le".getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("58.195.50.185"),10000); ds.send(dp); ds.close(); } }
3.1.4,udp接收端
1,定义udpsocket服务。
2,定义一个数据包,因为要存储接收到的字节数据,
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5,关闭资源。
class UdpRece { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(10000); while (true) { //2,定义数据包。用于存储数据, byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); ds.receive(dp);//阻塞式方法。 //4,通过数据包的方法获取其中的数据。 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip+"::"+data+"::"+port); } ds.close(); } }
3.2基于TCP协议的网络编程
3.2.1,ServerSocket
java中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的的Socket连接,如果没有连接,他将一直处于等待状态
ServerSocket构造函数
1,ServerSocket():创建非绑定服务器套接字
2,ServerSocket(int port):创建绑定到特定端口的服务器套接字
ServerSocket常用方法
1,Socket accept():侦听并接受此套接字的连接
2,void close():关闭此套接字
3,InetAddress getInetAddress():返回此服务器套接字的本地地址
3.2.2,Socket
客户端通常使用Socket的构造器来连接到指定服务器。
Socket构造函数
1,Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定IP地址的指定端口上
2,Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口上。
Socket方法
1,void close():关闭此套接字
2,InetAddress getInetAddress():返回套接字连接的地址
3,InputStream getInputStream():返回此套接字的输入流
4,OutputStream getOutputStream():返回此套接字的输出流
5,int getPort():返回此套接子连接到的远程端口
3.2.3,使用ServerSocket创建TCP服务器端
1,建立服务端的Socket服务,ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象
通过ServerSocket的accept()方法,没有连接就会等,所以这方法是阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
并打印在控制台上。
4,关闭服务端.
class TcpServer { public static void main(String[] args) { ServerSocket ss = new ServerSocket(10003); // 通过accept方法获取连接过来的客户端对象。 Socket S = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"............connect"); //获取客户端发送过来的数据,那么要使用客户端对象的速去流来读取数据。 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close();//关闭客户端 } }
3.2.4使用Socket进行通信
1,创建Socket服务,并指定要连接的主机和端口
class TcpClient { public static void main(String[] args) { //创建客户端的Socket服务,指定目的主机和端口 Socket s = new Socket("192,168,1,1254",10003); //为了发送数据,应该获取socket流中的输出流。 OutputStream out = s.getOutputStream(); out.write("oasdkjaskldj".getBytes()); s.close(); } }
4,URL&URLConnection
4.1,概述
1、URI:表示一个统一资源标识符 (URI) 引用。
2、URL:代表一个统一资源定位符,它是指向互联网“资源”的指针。
3、URN:统一资源名称。
4.2,常用方法
1,URL(String protocol,String host,int port,String file):根据指定 protocol、host、port号和 file 创建 URL对象。
2,InputStream openStream() :打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。
3,String getProtocol():获取协议名称。
4,String getHost():获取主机名。
5,int getPort():获取端口号。
6,String getFile():获取URL文件名。
7,String getPath():获取此URL的路径部分。
8,String getQuery():获取此URL的查询部,客户端传输的特定信息。
4.3,URLConnection
1,URLConnection openConnection():用URL调用此方法,返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。
2,InputStream getInputStream():获取输入流
3,OutputStream getOutputStream():获取输出流
注:openStream的底层是通过openConnection()实现的。url.openStream()的可以用以下代码来代替实现:
URL url = new URL(“str_rul”);//str_url是表示“ip地址+端口+路径文件+参数”的字符串。 URLConcetion conn = url.openConnection(); InputStream in = conn.getInputStream();
4.4URL应用实例
class URLDemo { public static void main(String[] args) throws IOException { String str_url = "http://127.0.0.1:8080/myweb/1.html"; URL url = new URL(str_url); System.out.println("getProtocol:"+url.getProtocol()); System.out.println("getHost:"+url.getHost()); System.out.println("getPort:"+url.getPort()); System.out.println("getFile:"+url.getFile()); System.out.println("getPath:"+url.getPath()); System.out.println("getQuery:"+url.getQuery()); InputStream in = url.openStream(); //获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket. URLConnection conn = url.openConnection(); String value = conn.getHeaderField("Content-Type"); System.out.println(value); System.out.println(conn); InputStream in = conn.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); String text = new String(buf,0,len); System.out.println(text); in.close(); } }
5,常见网络结构
5.1C/S结构(client/server)
5.1.1,特点:
1,该结构的软件,客户端和服务端都需要编写。
2,可发成本较高,维护较为麻烦。
5.1.2,好处:
客户端在本地可以分担一部分运算。
5.2,B/S结构(browser/server)
5.2.1,特点:
1,该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。
2,开发成本相对低,维护更为简单。
5.2.2,缺点:
所有运算都要在服务端完成。