定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输
常见的软件架构:
C/S:Client/Server(客户端/服务器)
在用户本地需要下载并安装客户端程序
-
- 画面可以很精美,用户体验好
- 需要开发客户端,也需要开发服务端
- 用户需要下载和更新太麻烦
B/S:Browser/Server(浏览器/服务器)
只需要浏览器,通过不同网址访问
-
- 不需要开发客户端,只要开发服务端
- 用户不需要下载,打开游览器就能玩
- 如果应用过大,用户体验差劲
网络编程三要素
-
- IP:设备在网络中的地址,是唯一的标识
- 端口号:应用程序在设备中唯一的表示
- 协议:数据在网络中传输的规则
IPv4:全称:Internet Protocol version 4
采用32地址长度,分成四组(最多2^32不够用) 点分十进制
IPv6:Internet Protocol version 4
采用128位地址长度,分成8组(2^128) 冒分16进制
特殊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发送信息:
- 创建发送端的DatagramSocket对象
细节:空参会随机一个端口发送
有参:指定端口绑定
- 数据打包(DatagramPacket)
new DatagramPacket(byte[] bytes,0,int len,InetAddress adress,int port)
address指定发送给哪个ip
port指定端口
- 发送数据
ds.send(dp);
- 释放资源
UDP接受信息:
- 创建DatagramSocket(port)
端口与发送端一致
- 接收数据包
DatagramPacket(bytes,bytes.length)
ds.receive(dp)
- 解析数据包
byte[] data=dp.getData(); 获取数据
int len=dp.getLength(); 获取长度
int port= dp.getPort(); 获取端口
InetAddress address=dp.getAddress(); 获取地址
UDP的三种通信方式:
- 单播
- 组播
地址:224.0.0.0~239.255.255.255
- 广播
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