网络

大都是计算机网络的基础知识,这里仅复习一下重点概念。

  1. IP地址=网络地址+主机地址
  2. IPv4最大的问题在于网络地址资源有限,制约了互联网的应用与发展。IPv6的使用,不仅能解决网络地址资源数量的问题,而且也解决了多种接入设备连入互联网的障碍
  3. 端口号用于标识计算机上某个特定的网络程序,范围是0~65535,其中0~1024已经被占用,当浏览器或程序要请求特定IP的某些服务时,需要使用IP地址+端口号的形式访问
  4. 常见的端口号:

ssh:22 ftp:21 smtp:25 http: 80

tomcat: 8080 mysql:3306 oracle:1521 sqlserver:1433

  1. OSI七层模型是理论上的,并没有实际使用。主要使用的是TCP/IP模型四层模型,分为:应用层、传输层、网际层、网络接口层
  2. TCP协议:
    • 使用TCP前需要“三次握手”建立连接,形成传输数据通道,进行可靠传输
    • TCP协议进行通信的两个应用进程:客户端、服务端
    • 在连接中可进行大数据量的传输
    • 传输完毕需要释放已建立的连接,效率较低
  3. UDP协议:
    • 将数据、源、目的地封装成数据包,不需要建立连接,不可靠传输
    • 每个数据包大小限制64KB
    • 传输效率高

Java网络编程

一般使用java.net包进行网络编程

InetAddress类

  1. getLocalHost:获取本机的InetAddress对象
  2. getByName:根据指定的主机名/域名获取IP地址对象
  3. getHostName:获取InetAddress对象的主机名
  4. 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(); // 没侦听到程序就会阻塞在这,如果侦听到了就会返回Socket对象
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通信

  1. DategramSocketDatagramPacket实现了基于UDP协议的网络通信
  2. 没有明确的服务端和客户端,只有数据的发送端与接收端,并且两者身份可互换
  3. 接收数据和发送数据是通过DatagramSocket对象完成
  4. 将数据封装到DatagramPacket对象中装包
  5. 当接收到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();
}
}