网络编程
内存
IO
数据通过网络进行交互(网络--内存)
软件系统架构C/S B/S
网络基础:
网络模型
ISO:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层
TCP/IP:应用层(业务功能/HTTP、FTP等/变量),传输层(分组/TCP UDP/流,数据报包),网络层(路由/IP/数据帧),数据链路层(010101111)
概念
TCP:建立在连接的基础上的。在传输数据之前,客户端和服务器会先建立连接
建立连接需要3次握手
1、客户端发送请求
2、服务器会响应
3、客户端会发送确认请求
断开连接需要4次握手
特点:可靠,点到点传输
效率低
适用的场景:对数据的质量传输有要求的
UDP:无连接。发送方只管发,接收方只管接。
特点:不太可靠
1对1,1对多,多对1
效率高
适用场景:对数据的质量传输要求不高。视频会议,语音通话
IP:唯一地指定网络上某一台主机
IPv4 32位
IPv6 128位
ipconfig 172.16.60.140
本机的回环地址:127.0.0.1/localhost
域名:www.baidu.com---dns服务器(解析成IP)
端口号:
一台主机上某个程序的唯一标识
所有的程序,系统会默认给分配一个端口号
程序也可以自己指定
端口号可用的范围[0,65535]
[0,1023]已经被系统占用
常用端口号:
tomcat:8080 mysql:3306 sqlserver:1433 oracle:1521
如何编程?
jdk 包java.net
TCP编程:
Socket 客户端
Socket(String host, int port) 创建一个流套接字并将其连接到指定主机上的指定端口号。
host:既可以用IP,也可以用域名
InputStream getInputStream() 返回此套接字的输入流。
OutputStream getOutputStream()
void shutdownOutput() 禁用此套接字的输出流。
对于 TCP 套接字,任何以前写入的数据都将被发送,并且后跟 TCP 的正常连接终止序列
void close()
ServerSocket 服务器
ServerSocket(int port)
Socket accept() 侦听并接受到此套接字的连接。在连接传入之前一直阻塞。
并没有维护写入流和读取流
是要客户端的流对象
void close()
案例:文件上传
客户端 1.jpg - 网络-- 服务器 1.jpg
客户端:
文件---内存 InputStream
内存---网络数据 socket. OutputStream
服务端
网络数据--内存 socket.InputStream
内存---文件 OutputStream
UDP:
无连接,不可靠,
传输速度快,可以支持1对1,1对多,多对1,多对多
DatagramSocket 既可以表示发送方,还可以表示接收方
发送或接收的包都是单独编址和路由的
从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
接收包时,应该将 DatagramSocket 绑定到通配符地址
DatagramSocket() ---发送
DatagramSocket(int port) 创建数据报套接字并将其绑定到本地主机上的指定端口。
DatagramSocket(int port, InetAddress laddr) 创建数据报套接字,将其绑定到指定的本地地址。---接收
void receive(DatagramPacket p) 从此套接字接收数据报包。在接收到数据报前一直阻塞
void send(DatagramPacket p) 从此套接字发送数据报包。
void close() 关闭此数据报套接字。
DatagramPacket 数据报包
DatagramPacket(byte[] buf, int length) 用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
byte[] getData() 返回数据缓冲区。
int getLength() 返回将要发送或接收到的数据的长度。
int getPort()
InetAddress getAddress()
setData(byte[] buf)
setPort(int iport)
setSocketAddress(SocketAddress address)
InetAddress 互联网协议 (IP) 地址
static InetAddress getByName(String host)在给定主机名的情况下确定主机的 IP 地址。
String getHostName() 获取此 IP 地址的主机名。
//即时聊天工具 QQ 微信 发信息
// Client
一个线程处理 发送
一个线程处理 接收