Java学习第十八节之网络编程
一、 网络基本概念
1、网络通信协议:即是一种通信规范
2、网络通信接口:包括硬件装置和软件设置,其中硬件设置是指实现结点之间的信息发送,软件设置是指规定双方进行通信的约定协议。
3、网络概述——OSI模型(Open SystemInterconnection,开放式系统互联)
注意:OSI的网络层(即常用的就是包括IP的层)同时支持面向连接和无连接的通信,但是传输层只支持面向连接的通信;TCP/IP五层模型即把上边的高三层统归为应用层,它的网络层只提供无连接服务,但是传输层上同时提供两种通信模式
4、IP地址,即是用来表示一台计算机的身份证,由网络地址(确定网络)和主机地址(网络中的主机)组成。
IP 地址的分为A类、B类、C类(常用)、D类和E类,也可分为IPV4和IPV6,目前使用的是IPV4,即4位十进制数,32位二进制数。
子网掩码是为了区分网络地址和主机地址
5、传输协议分为TCP和UDP
TCP(TransmissionControl Protocol 传输控制协议),使用三次握手的方式,可确保数据传送的次序和传输的可靠性,先建立连接,再传输数据,最后释放连接。在IP报文的协议号是6。
UDP(UserDatagram Protocol 用户数据报协议),是一个无连接协议,传输数据之前和终端不建立连接,是不可靠的协议。在IP报文的协议号是17。
TCP与UDP的区别
① TCP协议面向连接,UDP协议面向非连接
② TCP协议传输速度慢,UDP协议传输速度快
③ TCP有丢包重传机制,UDP没有
④ TCP协议保证数据正确性,UDP协议可能丢包
6、TCP套接字Socket,Socket是用于机器之间的通信的类,还可对IP地址和端口进行描述
二、Socket编程,即就是网络编程
1、类Socket的介绍
在java中套接字Socket(通信接口)被抽象为类,我们只需要创建Socket对象就可以使用套接字。Socket可以看做两个程序进行通讯连接的一个端点,Socket类中有输入、输出对象,同时能实现服务器之间的数据传输
常用方法:
●public InetAddressgetInetAddress(); //返回此套接字的地址
●public InetAddressgetLocalAddress(); //获得套接字绑定的本地地址
●public int port(); //获得此套接字连接到的远程端口
2、类ServerSocket的介绍
ServerSocket类:在客户端使用的是ServerSocket,只要是用于接收客户端传来的对象
常用构造函数:
● ServerSocket(); //创建非绑定服务器套接字
● ServerSocket(int port); //创建绑定到特定端口的服务器的套接字
● ServerSocket(int port,intbacklog);
//利用指定的backlog创建服务器套接字,并将其绑定到指定的本地端口号
● ServerSocket(int port,int backlog,InetAddress bindAddr);
//使用指定的端口、侦听backlog和要绑定到的本地IP地址创建服务器
提供的主要方法:
● public Socket accept();//侦听并接收到连接此套接字的连接,此方法在进行连接之前一直阻塞
● public void bind(SocketAddress addr);
//返回此服务器套接字的地址,IP地址和端口号都被封装在addr中
● public void close(); //关闭服务器套接字
● public InetAddress getInetAddress(); //返回此服务器套接字的本地地址
● public int getLocalPort(); //返回套接字进行侦听的端口
● public void setSoTimeout(int timeout); //启动带有指定超时值的SO_TIMEOUT,以ms为单位
3、代码应用
部分代码解读:
Socket服务器:(注意多个客户端访问时要用多线程解决出现的问题)
① ServerSocket server=new ServerSocket(port);//创建一个端口
② Sockets=server.accept(); //只有当客户端请求并连接,函数才会返回
③ BufferedReader br=newBufferedReader((new InputStream(s.getInputStream()));//接收数据
④ PrintWriter pw=newPrintWriter(new OutputStreamWriter(s.getOutputStream()),true)//发送数据
注意:PrintWriter会自动缓冲,使用它的时候需要使用println()函数
Socket客户端:
① Socket socket=new Socket(host,port); //打开一个套接字,发送请求
② BufferedReader br=newBufferedReader((new InputStream(s.getInputStream()));//接收数据
③ PrintWriter pw=newPrintWriter(new OutputStreamWriter(s.getOutputStream()),true)//发送数据
注意:以上代码均属于C/S,需要同时维护客户端和服务器的代码
B/S的浏览器和服务器只需要维护一方即可
代码出现问题一、在套接字中会发生阻塞的地方
A、实例化Socket对象的时候会阻塞
解决方案:Socket socket=newSocket(); //创建无连接Socket对象
socket.connect(new InetSocketAddress(host, port),timeout); //设置超时
B、在in.nextLine()类似操作时会阻塞
解决方案:设置socket.setSoTimeout(long); //设置超时时间
代码出现问题二、
A. 当客户端想要关闭套接字的时候,但却不能确定服务器是否还在发送数据,但是只要一关闭就立刻断掉
解决方案:socket.shutdownInput(); //关闭输入流
Socket.shutdownOutput(); //关闭输出流
4、DatagramPacket介绍
作为接受方法中的参数,DatagramPacket的数组,一个空的数组用来存放、接收数据对象中的数组
作为发送方法中的参数,DatagramPacket本身包含了目的端的IP和端口,以及存储例如要发送的内容的指定了长度的字节型数组