1. Use of InetAddress class
1.1. Two problems need to be solved to realize network communication
How to accurately locate one or more hosts on the network; locate specific applications on a host
How to transfer data reliably and efficiently after finding the host
1.2. Two elements of network communication
Corresponding question 1: IP and port number
Corresponding question 2: Provide network communication protocol: TCP/IP reference model (application layer, transport layer, network layer, physical + data link layer)
1.3. Communication element 1: IP and port number
Understanding of IP
IP: uniquely identifies a computer (communication entity) on the Internet
Use InetAddress class to represent IP in Java
IP Classification: IPv4 and IPv6; World Wide Web and Local Area Network
Area name: www.baidu.com, www.mi.com
Domain name resolution: The domain name is easy to remember. After entering the domain name of a host when connecting to the network, the domain name server (DNS) is responsible for converting the domain name into an IP address, so that a connection can be established with the host.
Local loop address: 127.0.0.1 corresponds to: localhost
InetAddress class: an object of this class represents a specific IP address
Instantiate:
getByName(String host)
getLocalHost()
Common methods:
getHostName()
getHostAddress()
Port number: the process running on the computer
Requirement: different port numbers for different processes
Range: specified as a 16-bit integer 0~65535
The combination of port number and IP address results in a network socket: Socket
1.4. Communication Element 2: Network Communication Protocol
OSI reference model
TCP/IP Reference Model
Protocols corresponding to each layer of the TCP/IP reference model
application layer, presentation layer, session layer
application layer
HTTP、FTP、Telnet、DNS…
transport layer
transport layer
TCP、UDP...
Network layer
Network layer
IP、ICMP、ARP…
data link layer, physical layer
Physical + Data Link Layer
Link
1.5, the difference between TCP and UDP
TCP protocol:
Before using the TCP protocol, a TCP connection must be established to form a transmission data channel
Before transmission, the "three-way handshake" method, point-to-point communication, is reliable
Two application processes for TCP protocol communication: client and server
A large amount of data can be transferred in the connection
After the transmission is completed, the established connection needs to be released, which is inefficient
UDP protocol:
Encapsulate data, source, and destination into packets without establishing a connection
The size of each datagram is limited to 64K
Regardless of whether the sender is ready or not, the receiver does not confirm receipt, so it is unreliable
Can broadcast
There is no need to release resources at the end of sending data, with low overhead and fast speed
1.6, TCP three-way handshake and four-way wave
客户端
服务端
seq=x,SYN=1
客户端发送syn报文,
并置发送序号为x
ACK=x+1,seq=y,SYN=1
服务端发送syn+ACK报文
并置发送序号为y,
再确定序号为x+1
ACK=y+1,seq=z
客户端发送ACK报文,
并置发送序号为z
再确定序号为Y+1
客户端
服务端
主动方
被动方
Fin=1,Ack=z,seq=x
主动方发送Fin+Ack报文,
并置发送序号为X
ACK=x+1,seq=z
被动方发送ACK报文,
并置发送序号为Z,
再确定序号为X+1
Fin=1,ack=x,seq=y
被动方发送Fin+Ack报文,
并置发送序号为Y,
再确定序号为X
ACK=Y,seq=x
主动方发送ack报文,
并置发送序号为X,
再确认序号为Y
主动方
被动方
2. TCP network programming
/**
* 客户端发送信息给服务端,服务端将数据显示在控制台上
*/
public class TCPTest1 {
// 客户端
@Test
public void client() {
Socket socket = null;
OutputStream os = null;
try {
// 1、创建Socket对象,指明服务器端的IP和端口号
InetAddress inet = InetAddress.getByName("127.0.0.1");
socket = new Socket(inet, 8899);
// 2、获取一个输出流,用于输出数据
os = socket.getOutputStream();
// 3、写出数据的操作
os.write("你好,我是客户端mm".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 4、资源的关闭
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//服务端
@Test
public void server () {
ServerSocket ss = null;
Socket socket = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
// 1、创建服务器端的ServerSocket,指明自己的端口号
ss = new ServerSocket(8899);
// 2、调用accept()表示接收来自客户端的socket
socket = ss.accept();
// 3、获取输入流
is = socket.getInputStream();
// 4、读取输入流中的数据
baos = new ByteArrayOutputStream();
byte[] buffer = new byte[5];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
System.out.println(socket.getInetAddress().getHostAddress() + ":" + baos.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
// 5、关闭资源
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 客户端发送文件给服务端,服务端将文件保存在本地
*/
public class TCPTest2 {
// 客户端
@Test
public void client () {
Socket socket = null;
OutputStream os = null;
FileInputStream fis = null;
try {
socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
os = socket.getOutputStream();
fis = new FileInputStream(new File("beauty.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//服务端
@Test
public void server () {
ServerSocket ss = null;
Socket socket = null;
InputStream is = null;
FileOutputStream fos = null;
try {
ss = new ServerSocket(9090);
socket = ss.accept();
is = socket.getInputStream();
fos = new FileOutputStream(new File("beauty1.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
/**
* 从客户端发送文件给服务器,服务端保存到本地。并返回“发送成功”给客户端
* 并关闭相关的连接
*/
public class TCPTest3 {
// 客户端
@Test
public void client ()
{
Socket socket = null;
OutputStream os = null;
FileInputStream fis = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try {
socket = new Socket(InetAddress.getByName("127.0.0.1"), 9090);
os = socket.getOutputStream();
fis = new FileInputStream(new File("beauty.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
os.write(buffer, 0, len);
}
// 关闭数据的输出
socket.shutdownOutput();
// 接收来自于服务器端的数据,并显示到控制台上
is = socket.getInputStream();
baos = new ByteArrayOutputStream();
byte[] buffer1 = new byte[20];
int len1;
while ((len1 = is.read(buffer1)) != -1) {
baos.write(buffer1, 0, len1);
}
System.out.println(baos.toString());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (baos != null) {
try {
baos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// 服务端
@Test
public void server () {
ServerSocket ss = null;
Socket socket = null;
InputStream is = null;
FileOutputStream fos = null;
OutputStream os = null;
try {
ss = new ServerSocket(9090);
socket = ss.accept();
is = socket.getInputStream();
fos = new FileOutputStream(new File("beauty2.jpg"));
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("图片传输完成");
// 服务器端给予客户单反馈
os = socket.getOutputStream();
os.write("你好,美女,照片我已收到,非常漂亮!".getBytes());
} catch (IOException e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (socket != null) {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ss != null) {
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
3. UDP network programming
public class UDPTest {
// 发送端
@Test
public void sender () {
DatagramSocket socket = null;
try {
socket = new DatagramSocket();
String str = "我是UDP方式发送的导弹";
byte[] data = str.getBytes();
InetAddress inet = InetAddress.getLocalHost();
DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet, 9090);
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (socket != null) {
socket.close();
}
}
}
// 接收端
@Test
public void receiver () {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(9090);
byte[] buffer = new byte[100];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
System.out.println(new String(packet.getData(), 0, packet.getLength()));
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
}
}
4. URL programming
4.1. Understanding of URL (Uniform Resource Locator)
Uniform resource locator, corresponding to a resource address on the Internet
4.2. Five basic structures of URL
protocol
CPU name
The port number
resource address
parameter list
4.3, how to instantiate
URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom")
4.4 Common methods
public String getProtocol(): Get the protocol name of the URL
public String getHost(): Get the host name of the URL
public String getPort(): Get the port number of the URL
public String getPath(): Get the file path of the URL
public String getFile(): Get the file name of the URL
public String getQuery(): Get the query name of the URL
4.5, can read and download the corresponding url resources
public static void main(String[] args) {
HttpURLConnection urlConnection = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URL url = new URL("http://localhost:8080/examples/beauty.jpg");
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.connect();
is = urlConnection.getInputStream();
fos = new FileOutputStream("day10\\beauty3.jpg");
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("下载完成");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (urlConnection != null) {
urlConnection.disconnect();
}
}
}