网络是什么?
网络就是计算机之间通过某种方式连接起来,可以进行通信,数据传输,资源共享的一种方式。
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地址
java
InetAddress address = InetAddress.getByName("www.baidu.com");
String ip = address.getHostAddress();
System.out.println(ip);
获取主机名
java
InetAddress address = InetAddress.getByName("www.baidu.com");
String hostName = address.getHostName();
System.out.println(hostName);
判断是否可达
java
InetAddress address = InetAddress.getByName("www.baidu.com");
boolean reachable = address.isReachable(5000);
System.out.println(reachable);
获取本地主机
java
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
使用Socket类完成TCP通信
Socket是Java中用于网络通信的类,可以通过该类实现客户端和服务器之间的通信。
创建Socket
java
Socket socket = new Socket("localhost", 8080);
发送数据
java
OutputStream outputStream = socket.getOutputStream();
outputStream.write("Hello World".getBytes());
接收数据
java
InputStream inputStream = socket.getInputStream();
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
System.out.println(new String(buffer, 0, len));
关闭Socket
java
socket.close();
示例一
java
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 {
}
}
}
示例二
java
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通信
示例
java
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 {
}
}
}