网络编程
- 三要素:ip、端口号、协议
ip
- ip是给每一台连接在互联网的电脑分配一个地址
- ipv4:是由4个字节组成,一般的网络是192.168.0.0,a类一般是政府或者军事用途,本地的特殊ip是127.0.0.1,查看本地电脑的ip地址,使用命令指示符ipconfig。
- ipv6:是由16个字节组成,也可以用四个16进制表示
- java提供的获取ip类InetAddress
- public static InetAddress getLocalHost() 返回本地主机
- public String getHostAddress() 获取ip地址
- public String getHostName() 获取ip的主机名:public String getHostName()
端口号
- 每一个软件(每一个进程的唯一标识) ,是当软件开启之后,系统给其生成的一个,也可以自己去设置,当软件开启时端口号系统产生,当软件关闭的时候,会回收。
- 常用的端口号
- Tomcat: 8080
- oracle:1521
- mysql:3306
- qq:4000
协议
- 计算机网络传输的规范: 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
- 传输层:TCP+UDP+xmpp–>即时通讯
- web主要的协议:http协议、https协议、
- UDP面向无连接的协议:传输速度块,但是会丢失数据,会出现卡顿。
- TCP面向连接的协议,:传输速度慢,不会丢失数据(三次握手),需要确保数据的准确性,使用这个协议。
- http与https:都是属于一次性的连接,也就是客户端给服务器发送请求,当交互完,这个请求就会断开。
- https=http+ssl证书,这个证书保证数据的传输安全性,大部分网站是使用这个协议。
基于TCP协议进行传输
Socket
- Socket对象:套接字是两台机器通信的断点。
- 构造方法:public Socket(String host,int port) 如果是本机ip地址传递localhost,第一个参数传的是ip地址,第二个是端口号。
- 常规的方法:
- public OutputStream getOutputStream()throws IOException 写数据的流对象,可用OutputStream类来获取
- public InputStream getInputStream()throws IOException 读取数据的对象,可用InputStream类来获取
- public void shutdownOutput()throws IOException 类似于flush()方法,应注意通过以上的方法获取的流,调用close()方法,socket也会关闭
- 客户端对服务端发送数据的基本实现步骤;
- 实例化socket对象
- 通过socket对象 得到输出流 OutputStream
- 调用write()
- 拿到输入流 InputStream
- new BufferReader(new InputStreamReader(new FileInputStream))
- 关闭资源
ServerSocket
- 此类实现的是服务器的套接字
- 构造:public ServerSocket(int port) 需要与客户端的端口号一样
- 常用的方法
- public Socket accept()throws IOException 监听客户端发送的消息,返回值是Socket类
- 服务器获取客户端的消息:
- 实例化ServerSocket
- 调用 accept() 返回的是一个socket对象
- 拿到输入流 InputStream
- new BufferReader(new InputStreamReader(new FileInputStream))
- 得到OutputStream 对象
- 调用 write()
- shutdownOutput()
- 注意:运行的时候要先运行服务器,再运行客户端
基于UDP协议进行传输
DtagramScoket
- DatagramSocket 此类表示用来发送和接收数据报包的套接字
- 构造方法:
- public DatagramSocket(int port,InetAddress laddr) 第一个数端口号 第二个参数是地址
- public DatagramSocket(int port)参数是端口号
- 常规方法:
- public void send(DatagramPacket p)throws IOException 发送数据包
- public void receive(DatagramPacket p)throws IOException 接收数据包
DatagramPacket
- 此类表示数据报包 (包裹对象)
- 构造:
- DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)第一个参数是 字节数组,第二个参数是从字节数组的什么地方开始 ,第二个参数是从字节数组的什么地方开始,第四个:获取的ip对象,第五个就是端口号。
- DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
- 常用方法:public byte[] getData() 获取缓冲区的数据
- 基于UDP的客户端传输步骤:
- 实例化这个对象
- 构建一个数据包
- 发送数据
- 发送数据
- 基于UDP的服务器接收步骤;
- 实例化这个对象DatagramSocket
- 构建一个包裹对象
- 接收数据 receive()
- 关闭资源
- UDP比较繁琐,没有获取流对象的方法,所以只能够按照以上的方法操作。