定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输

常见的软件架构:

C/S:Client/Server(客户端/服务器)

在用户本地需要下载并安装客户端程序

    1. 画面可以很精美,用户体验好
    2. 需要开发客户端,也需要开发服务端
    3. 用户需要下载和更新太麻烦

B/S:Browser/Server(浏览器/服务器)

只需要浏览器,通过不同网址访问

    1. 不需要开发客户端,只要开发服务端
    2. 用户不需要下载,打开游览器就能玩
    3. 如果应用过大,用户体验差劲

网络编程三要素

    1. IP:设备在网络中的地址,是唯一的标识
    2. 端口号:应用程序在设备中唯一的表示
    3. 协议:数据在网络中传输的规则

IPv4:全称:Internet Protocol version 4

采用32地址长度,分成四组(最多2^32不够用) 点分十进制

IPv6:Internet Protocol version 4

采用128位地址长度,分成8组(2^128) 冒分16进制

【JavaSE】网络编程-LMLPHP

特殊IP地址:127.0.0.1 是localhost:是回送地址,也称本机ip

常用的CMD命令

ipconfig:查看本机ip地址

ping:检查网络是否联通

Static InetAddress getByname(String host) 确定主机名称的ip地址,主机名称可以是机器名称,也可以是ip地址】】

String getHostName() 获取次ip地址的主机名(局域网找不到就返回ip)

String getHostAddress() 返回文本显示的地址字符串

端口号:

由两个字节表示的整数,取值范围:0~65535

其中0~1023之间的端口号用于知名网络服务和应用

***一个端口号只能被一个应用程序使用

协议:

UDP

  • 用户数据报协议
  • UDP是面向无连接通讯协议
    • 速度快有大小限制,最多一次发送64K,数据不安全,易丢失数据

TCP

  • 传输控制协议TCP
  • TCP协议是面向连接的通讯协议
  • 速度慢,没有大小限制,数据安全

UDP

UDP发送信息:

  1. 创建发送端的DatagramSocket对象

细节:空参会随机一个端口发送

有参:指定端口绑定

  1. 数据打包(DatagramPacket)

new DatagramPacket(byte[] bytes,0,int len,InetAddress adress,int port)

address指定发送给哪个ip

port指定端口

  1. 发送数据

ds.send(dp);

  1. 释放资源

UDP接受信息:

  1. 创建DatagramSocket(port)

端口与发送端一致

  1. 接收数据包

DatagramPacket(bytes,bytes.length)

ds.receive(dp)

  1. 解析数据包
byte[] data=dp.getData();  获取数据
int len=dp.getLength();    获取长度
int port= dp.getPort();    获取端口
InetAddress address=dp.getAddress();    获取地址

UDP的三种通信方式:

  1. 单播
  2. 组播

地址:224.0.0.0~239.255.255.255

  1. 广播

TCP

TCP发送消息

1、客户端

  • 创建Socket(String host, int port)对象
  • 向服务器发送连接请求
  • 向服务器发送服务请求
  • 接受服务结果(服务响应)
  • 关闭流和Socket对象

发送数据的步骤

1、创建客户端的Socket对象(Socket)

Socket(String host, int port)

2、获取输出流,写数据

OutputStream getOutputStream()

3、释放资源

Soc创建Socket(String host, int port)对象
向服务器发送连接请求
向服务器发送服务请求
接受服务结果(服务响应)
关闭流和Socket对象ket socket=new Socket("127.0.0.1",10086);
OutputStream os=socket.getOutputStream();
OutputStreamWriter osw=new OutputStreamWriter(os);
while (true){
    String str=sc.next();
    osw.write(str);
    if(str.equals("再见")){
        break;
    }
    osw.flush();
}


osw.close();
socket.close();

2、服务端

创建ServerSocket(int port)对象

  • 在Socket上使用accept方法监听客户端的连接请求
  • 阻塞、等待连接的建立
  • 接收并处理请求信息
  • 将处理结果返回给客户端
  • 关闭流和Socket对象

1、创建服务器端的Socket对象(ServerSocket)

ServerSocket(int port)

2、获取输入流,读数据,并把数据显示在控制台

Socket accept()

3、释放资源

public static void main(String[] args) throws IOException {

    ServerSocket ss=new ServerSocket(10086);
    while (true) {
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        InputStreamReader ir = new InputStreamReader(is);
        int len;
        char[] chars=new char[1024];
        String str=null;
        while ((len = ir.read(chars)) != -1) {
            str=new String(chars,0,len);
            System.out.println(str);
            if(str.equals("再见")){
                break;
            }
        }
        if(str.equals("再见")){
            break;
        }
        socket.close();;

    }
    ss.close();;


}

注意

TCP IO流循环结束的的标志不是-1,开始的时候结束是因为发送端结束凿毁了socket通道

一个secokt服务端只能接受一个来源,多个来源没办法区分

Http协议一行一行是靠换行符进行区分

GET / HTTP/1.1
Host: 127.0.0.1:10086
Connection: keep-alive
sec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6,ja;q=0.5
04-03 20:50