网络是什么?
网络就是计算机之间通过某种方式连接起来,可以进行通信,数据传输,资源共享的一种方式。
ip地址
ip地址就是计算机在网络中的唯一标识,通过ip地址可以找到对应的计算机。
ipv4与ipv6
ipv4是32位的IP地址,用点分十进制表示,例如:192.168.1.1
ipv6是128位的IP地址,用冒号分十六进制表示,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334
端口
端口就是计算机上的一个软件程序,通过端口可以找到对应的软件程序,进行通信。
所以,ip地址和端口组合起来就是计算机上的一个软件程序。
域名
域名就是ip地址的别名,通过域名可以找到对应的ip地址,进行通信。
例如:www.baidu.com对应的ip地址是 [183.240.98.161]
网络协议
网络协议就是计算机之间通信的规则,用于规定数据的格式,传输方式等。
例如:TCP/IP协议,HTTP协议等。
TCP/IP协议
TCP/IP协议是互联网的基础协议,分为四层:应用层,传输层,网络层,数据链路层。
- 应用层:负责应用程序之间的通信,例如:HTTP,FTP等。
- 传输层:负责应用程序之间的数据传输,例如:TCP,UDP等。
- 网络层:负责数据包的传输,例如:IP,ICMP等。
- 数据链路层:负责数据包的传输,例如:ARP,RARP等。
TCP协议
TCP协议是一种可靠的,面向连接的协议,用于保证数据的完整性和顺序性。
- 三次握手:建立连接的过程,需要三次握手,确保双方都准备好进行通信。
- 四次挥手:断开连接的过程,需要四次挥手,确保双方都准备好断开连接。
- 数据传输:通过TCP协议传输数据,数据会被分成多个数据包,进行传输。
UDP协议
UDP协议是一种不可靠,无连接的协议,用于快速传输数据。
- 数据传输:通过UDP协议传输数据,数据不会被分成多个数据包,直接进行传输。
网络编程
InetAddress类的使用
InetAddress类是Java中用于表示IP地址的类,可以通过该类获取IP地址,主机名等信息。
获取IP地址
InetAddress address = InetAddress.getByName("www.baidu.com");
String ip = address.getHostAddress();
System.out.println(ip);
获取主机名
InetAddress address = InetAddress.getByName("www.baidu.com");
String hostName = address.getHostName();
System.out.println(hostName);
判断是否可达
InetAddress address = InetAddress.getByName("www.baidu.com");
boolean reachable = address.isReachable(5000);
System.out.println(reachable);
获取本地主机
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
使用Socket类完成TCP通信
Socket是Java中用于网络通信的类,可以通过该类实现客户端和服务器之间的通信。
创建Socket
Socket socket = new Socket("localhost", 8080);
发送数据
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello World".getBytes());
接收数据
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
System.out.println(new String(buffer, 0, len));
关闭Socket
socket.close();
示例一
public class ServerTest {public static void main(String[] args) {try {// 监听6666端口ServerSocket serverSocket = new ServerSocket(6666);// 建立连接套接字Socket socket = serverSocket.accept();// 获取输入流InputStream inputStream = socket.getInputStream();int len = 0;byte[] bytes = new byte[1024];while((len = inputStream.read(bytes)) != -1) {System.out.println("叮咚,来自客户端的又一条信息:" + new String(bytes, 0, len));}OutputStream outputStream = socket.getOutputStream();outputStream.write("娇女我轻扶琴 燕嬉我紫竹林".getBytes());//socket.shutdownOutput();inputStream.close();outputStream.close();socket.close();serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);} finally {}}
}public class ClientTest {public static void main(String[] args) {try {Socket socket = new Socket(InetAddress.getLocalHost(),6666 );OutputStream outputStream = socket.getOutputStream();outputStream.write("今日我赢酒醉,醉把佳人成双对~".getBytes());InputStream inputStream = socket.getInputStream();// 设置结束标记socket.shutdownOutput();int len = 0;byte[] bytes = new byte[1024];while((len = inputStream.read(bytes)) != -1) {System.out.println("叮咚,来自服务器端的又一条信息:" + new String(bytes, 0, len));}outputStream.close();inputStream.close();socket.close();} catch (IOException e) {throw new RuntimeException(e);} finally {}}
}
示例二
public class ServerTest {public static void main(String[] args) {try {// 监听6666端口ServerSocket serverSocket = new ServerSocket(6666);// 建立连接套接字Socket socket = serverSocket.accept();// 获取输入流InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String str = null;while((str = bufferedReader.readLine()) != null) {System.out.println("叮咚,来自客户端的又一条信息:" + str);}OutputStream outputStream = socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("娇女我轻扶琴 燕嬉我紫竹林");bufferedWriter.newLine();bufferedWriter.flush();//socket.shutdownOutput();bufferedWriter.close();bufferedReader.close();socket.close();serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);} finally {}}
}public class ClientTest {public static void main(String[] args) {try {Socket socket = new Socket(InetAddress.getLocalHost(),6666 );OutputStream outputStream = socket.getOutputStream();BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("今日我赢酒醉,醉把佳人成双对~");bufferedWriter.newLine();bufferedWriter.flush();InputStream inputStream = socket.getInputStream();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));// 设置结束标记socket.shutdownOutput();String str = "";while((str = bufferedReader.readLine()) != null) {System.out.println("叮咚,来自服务器端的又一条信息:" + str);}bufferedReader.close();bufferedWriter.close();socket.close();} catch (IOException e) {throw new RuntimeException(e);} finally {}}
}
netstat命令
netstat -an 查看端口监听和网络情况
netstat -anb 查看端口监听和网络情况,并显示占用端口的程序名称
netstat -anb | more 分页查看端口监听和网络情况,并显示占用端口的程序名称
使用DatagramSocket完成UDP通信
示例
public class ServerTest {public static void main(String[] args) {try {// 创建UDP套接字DatagramSocket datagramSocket = new DatagramSocket(6666);byte[] bytes = new byte[1024];// 创建接收数据的数据包DatagramPacket datagramPacket = new DatagramPacket(bytes,1024);// 接收数据包datagramSocket.receive(datagramPacket);// 拆包int len = datagramPacket.getLength();byte[] data = datagramPacket.getData();System.out.println("叮咚,您有一条由客户端发送的信息:" + new String(data,0,len));data = "让我再靠近一点点 因为你太温暖 我会再变得坚强一点点 因为你太柔软".getBytes();// 创建发送的数据包datagramPacket = new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),8888);// 发送数据包datagramSocket.send(datagramPacket);// 关闭套接字datagramSocket.close();} catch (SocketException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} finally {}}
}public class ClientTest {public static void main(String[] args) {try {// 创建UDP套接字DatagramSocket datagramSocket = new DatagramSocket(8888);byte[] data = "城中楼阁 几经风霜".getBytes();// 创建发送数据包,指定发送目的套接字DatagramPacket datagramPacket = new DatagramPacket(data,data.length,InetAddress.getByName("127.0.0.1"),6666);// 发送数据包datagramSocket.send(datagramPacket);// 接收数据包datagramSocket.receive(datagramPacket);// 拆包int len = datagramPacket.getLength();data = datagramPacket.getData();System.out.println("叮咚,收到来自服务器端的一条新的消息:" + new String(data,0,len));// 关闭套接字datagramSocket.close();} catch (SocketException e) {throw new RuntimeException(e);} catch (UnknownHostException e) {throw new RuntimeException(e);} catch (IOException e) {throw new RuntimeException(e);} finally {}}
}