网络
大都是计算机网络的基础知识,这里仅复习一下重点概念。
- IP地址=网络地址+主机地址
- IPv4最大的问题在于网络地址资源有限,制约了互联网的应用与发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍
- 端口号用于标识计算机上某个特定的网络程序,范围是0~65535,其中0~1024已经被占用,当浏览器或程序要请求特定IP的某些服务时,需要使用IP地址+端口号的形式访问
- 常见的端口号:
ssh:22 ftp:21 smtp:25 http: 80
tomcat: 8080 mysql:3306 oracle:1521 sqlserver:1433
- OSI七层模型是理论上的,并没有实际使用。主要使用的是TCP/IP模型四层模型,分为:应用层、传输层、网际层、网络接口层
- TCP协议:
- 使用TCP前需要“三次握手”建立连接,形成传输数据通道,进行可靠传输
- TCP协议进行通信的两个应用进程:客户端、服务端
- 在连接中可进行大数据量的传输
- 传输完毕需要释放已建立的连接,效率较低
- UDP协议:
- 将数据、源、目的地封装成数据包,不需要建立连接,不可靠传输
- 每个数据包大小限制64KB
- 传输效率高
Java网络编程
一般使用java.net包进行网络编程
InetAddress类
- getLocalHost:获取本机的InetAddress对象
- getByName:根据指定的主机名/域名获取IP地址对象
- getHostName:获取InetAddress对象的主机名
- getHostAddress:获取InetAddress对象的IP地址
Socket
Socket(套接字)已经成为开发网络应用程序的标准,两台机器进行网络通信时,两端都要有Socket,作为两台机器间通信的端点,网络通信本质上就是Socket间的通信。
Socket允许程序把网络连接当成一个流,数据在两个Socket间通过IO传输,一般主动发起通信的应用程序为客服端,等待通信请求的是服务端。
Socket-TCP通信
当需要TCP进行通讯时,使用socket.getOutputStream()和socket.getInputStream()
,当客户端连接到服务端时,客户端会由TCP/IP协议分配一个端口与服务端进行通信。
服务器端:
public class Server{ public static void main(String[] args) throws IOException { int port = 9999; ServerSocket serverSocket = new ServerSocket(port); System.out.println("服务器端正在侦听" + port + "端口"); Socket socket = serverSocket.accept(); InputStream inputStream = socket.getInputStream(); byte[] buf = new byte[1024]; int readLen; String str = ""; while((readLen = inputStream.read(buf)) != -1){ str += new String(buf, 0, readLen); } inputStream.close(); socket.close(); serverSocket.close(); System.out.println(str); } }
|
客户端:
public class Client{ public static void main(String[] args) throws IOException { Socket socket = new Socket(InetAddress.getLoaclHost(), 9999); OutputStream outputStream = socket.getOutputStream(); outputStream.write("Hello,Server".getBytes()); outputStream.close(); socket.close(); } }
|
Socket-UDP通信
- 类DategramSocket和DatagramPacket实现了基于UDP协议的网络通信
- 没有明确的服务端和客户端,只有数据的发送端与接收端,并且两者身份可互换
- 接收数据和发送数据是通过DatagramSocket对象完成
- 将数据封装到DatagramPacket对象中装包
- 当接收到DatagramPacket对象时需要进行拆包,取出数据
实例
端口1:
public class Port1 { public static void main(String[] args) throws IOException { DatagramSocket ds = new DatagramSocket(9999); byte[] buf = new byte[1024]; DatagramPacket res = new DatagramPacket(buf, buf.length); ds.receive(res); int len = res.getLength(); byte[] data = res.getData(); String str = new String(data, 0, len); System.out.println(str); ds.close(); } }
|
端口2:
public class Port2 { public static void main(String[] args) throws IOException { System.out.println("你想说什么?"); Scanner scanf = new Scanner(System.in); String s = scanf.next(); byte[] buf = s.getBytes(); DatagramSocket ds = new DatagramSocket(9998); DatagramPacket sen = new DatagramPacket(buf, buf.length, InetAddress.getLocalHost(), 9999); ds.send(sen); ds.close(); } }
|