JavaSE进阶——Day12 网络编程

JavaSE进阶——该篇主要讲解Java中的网络编程

网络编程

概述

在企业开发中,程序存在两种结构模型:

  • C / S : 客户端/服务端
    • 需要开发客户端和服务端,两端程序(开发成本高)
  • B / S : 浏览器/服务端
    • 浏览器:是由第三方浏览器厂商已提供了(不需要开发了)
    • 服务端:需要开发程序

网络三要素

在网络中想要实现编程,必须有:网络三要素

  • IP地址:网络上计算机的唯一标识
  • 端口号:计算机中程序的唯一标识(每一个程序都有自己唯一的端口号)
  • 通信协议:网络上程序之间交互的规则
    • TCP协议
    • UDP协议

网络编程

会使用到java.net包下的AIP

  • java.net.InetAddress类 : IP地址

    1
    2
    3
    4
    5
    6
    //获取InetAddress对象
    InetAddress ipObj = InetAddress.getByName("计算机名 / IP地址")

    //调用方法
    String hostname = ipObj.getHostName();
    String ip = ipObj.getHostAddress();

常见通信协议 :

  • UDP协议
    • 特点:
      1. 面向无连接协议
      2. 数据大于限制在64K以内
      3. 数据不安全,容易丢失
      4. 传输速度快
  • TCP协议:传输控制协议
    • 特点:
      1. 面向有连接协议(利用TCP三次握手机制)
      2. 数据大小没有限制
      3. 数据相对安全(相对UDP协议来讲)
      4. 传输速度慢

TCP通信程序,要求必须有两端程序:

  • 客户端/浏览器
  • 服务端

Socket

在Java语言中,想要实现客户端、服务端两个程序之间进行交互,需要依赖:Socket (利用TCP协议)

  • 客户端程序:Socket
    • 先找到计算机 ==//IP地址==
    • 再找到计算机上的服务端程序 ==//端口号==
    • 按照TCP协议进行数据发送、接收
      • 是基于IO流实现数据的发送、接收
  • 服务端程序:ServerSocket
    • 绑定服务端程序的端口号

java.net.Socket类:客户端

1
2
3
4
5
6
public Socket(String address , int port)
//参数1: ip地址或主机名
//参数2: 端口号(服务端程序的端口号)

OutputStream getOutputStream() //基于socket对象获取网络输出流(发送数据)
InputStream getInputStream() //基于socket对象获取网络输入流(接收数据)
1
2
3
4
5
6
7
8
9
10
//1. 创建客户端Socket对象,并连接服务端程序
Socket socket = new Socket("对方计算机IP地址", "服务端程序端口号");
//2. 基于socket对象,获取网络输出流(发送数据)
OutputStream netOut = socket.getOutputStream();
//3. 发送数据
netOut.write("数据".getBytes());

//4. 关闭资源
netOut.close();
socket.close();

java.net.ServerSocket:服务端

1
2
3
4
5
public ServerSocket(int port)
//参数:port 当前服务端程序要绑定的端口号(客户端Socket程序要使用这个端口号和服务端连接)


public Socket accept();//监听客户端连接,并生成连接,返回一个Socket对象

案例一

使用一对一接发数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package netsocket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/5/2 12:40
* @Project JavaCode_SE_Advance
* @Theme 服务端
*/
public class ServerDemo2 {
private static final Logger LOGGER = LoggerFactory.getLogger("服务端");
public static void main(String[] args) throws IOException {
//创建服务端对象
ServerSocket serverSocket = new ServerSocket(8888);
LOGGER.trace("服务端已启动.......");
//监听客户端
Socket sever = serverSocket.accept();
LOGGER.trace("已连接客户端:" + sever.getInetAddress().getHostAddress());

//创建输入流对象
InputStream inputStream = sever.getInputStream();

//接受客户端发送的数据(IO流)
byte[] buf = new byte[1024];
int len = inputStream.read(buf);

//收到数据
String msg = new String(buf, 0, len);
System.out.println(msg);

//回馈数据

//创建输出流并添加数据
OutputStream outputStream = sever.getOutputStream();
outputStream.write("你好你好".getBytes());

//资源关闭
inputStream.close();
outputStream.close();
serverSocket.close(); //服务端一般是不用关闭的
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package netsocket;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/5/2 12:31
* @Project JavaCode_SE_Advance
* @Theme 客户端
*/
public class ClientDemo2 {
//创建日志成员变量
private static final Logger LOGGER = LoggerFactory.getLogger("客户端");

public static void main(String[] args) throws IOException {
//创建客户端对象
Socket client = new Socket("127.0.0.1", 8888);

//给服务端发送数据

//创建输出流并写入数据
OutputStream outputStream = client.getOutputStream();
outputStream.write("你好啊,我的客户端".getBytes());

//接收服务端信息

//创建输入流并读取
InputStream inputStream = client.getInputStream();
byte[] buf = new byte[1024];
int len = inputStream.read(buf);
String msg = new String(buf, 0, len);
LOGGER.trace("收到客户端数据:" + msg);

//关闭资源
inputStream.close();
outputStream.close();
client.close();

}
}

使用多(并行)对一实现接发

java编程中使用的包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
java.lang

java.util.集合

java.text.SimpleDateFormat

java.io

java.net

java.sql


javax //扩展包