定义:在网络通信协议下,不同计算机上运行的程序,进行的数据传输
常见的软件架构:
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
传输控制协议TCPTCP协议是面向连接的通讯协议速度慢,没有大小限制,数据安全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.1Host: 127.0.0.1:10086Connection: keep-alivesec-ch-ua: "Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"sec-ch-ua-mobile: ?0sec-ch-ua-platform: "Windows"Upgrade-Insecure-Requests: 1User-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.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7Sec-Fetch-Site: noneSec-Fetch-Mode: navigateSec-Fetch-User: ?1Sec-Fetch-Dest: documentAccept-Encoding: gzip, deflate, brAccept-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