导图社区 网络编程BS结构知识框架学习笔记
网络编程结构包括BS结构,CS结构,IP地址,端口号,网络数据传输注意事项,udp协议等知识点。对网络编程感兴趣的小伙伴可以看看哟。
编辑于2022-11-15 09:49:16 广东网络编程B/S结构知识框架学习笔记
B/S结构
浏览器B
服务器S
C/S结构
客户端C
服务器S
4层/5层/7层模型
应用层
应用层
应用层
表示层
会话层
传输层
传输层
传输层
互联网层
互联网层
网络层
网络接口层
数据链路层
数据链路层
物理层
物理层
TCP/IP
Transmission Control Protocal 传输控制协议
Internet Protocol 网际协议
TCP协议建立连接需要三次会话(握手)
A->B
B->A
A->B
IP地址:网络中每台计算机的一个标识号
是一个逻辑地址
127.0.0.1 localhost代表本机地址
端口号:具有网络功能的应用软件的标识号
端口是一个软件结构,被客户程序或服务程序用来发送和接收数据,一台服务器有256*256个端口。
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的
1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。
端口与协议有关:TCP和UDP的端口互不相干
ServerSocket
需要指定开放的端口号
相当于电话局
Socket对象的获得是通过accept()得到的
Socket
客户端的Socket是new出来的,创建的时候需要指定服务器的ip,端口号
InetAddress getInetAddress() 返回此套接字连接到的远程 IP 地址;
InetAddress getLocalAddress() 获取套接字绑定的本地地址。
int getPort() 返回此套接字连接到的远程端口。
int getLocalPort() 回此套接字绑定到的本地端口。
InputStream getInputStream() 返回此套接字的输入流。
OutputStream getOutputStream() 返回此套接字的输出流。
服务器和客户端都需要输入和输出流
boolean isClosed()返回此套接字是否已经关闭
void close() 关闭Socket
java.net.InetAddress
static InetAddress getLocalHost()返回本地主机
static InetAddress getByName(String host) 在给定主机名的情况下确定主机(可以用ip地址或主机名表示)的 IP 地址
String getHostAddress() 返回 IP 地址字符串(以文本表现形式)是一个对象方法.
网络数据传输注意事项
服务器读取网络上的远程数据时不应该以读到-1(或readLine得到null)作为结束, 应该用先前客户端告知的文件大小与累计接收到的数据大小比较来判断循环是否应该结束.
客户端关闭流会让服务器读到-1,如果客户端在上传完文件后还要给服务器发其他信息,服务器就不能结束循环了,直到客户端close掉输出流
关闭任何关联到Socket上的流,都会将Socket自动关闭掉;
关闭Socket将会自动关闭关联在上面的流.
关闭高级流会递归的关闭它包装的低级流.
C/S结构中 流的搭建顺序原则 交替搭建
服务器先建输入流,后建输出流, 客户端就先建输出流,再建输入流;
服务器先建输出流,后建输入流, 客户端就先建输入流,再建输出流;
Socket编程常见问题
SocketException: Socket closed
关闭了某个基于Socket的流导致Socket被自动关闭, 其他关联在Socket上的流也会被自动关闭掉.
ConnectException: Connection refused: connect
无法连接到服务器,有可能服务器未开启或者端口号不对
多个控制台如何切换?
BindException: Address already in use: JVM_Bind
原因:服务器启动多个在绑定同一个端口
客户端和服务器不在同一个电脑上时,如何连接?
客户端需要指定要连接的服务器的ip和端口号
UDP协议
UDP(User Datagram Protocol)用户数据报协议
UDP和TCP位于同一层-传输层,但它对于数据包的顺序错误或重发没有TCP来的可靠。
UDP是一种面向无连接的通信协议。UDP向应用程序提供了一种发送封装的原始IP数据报的方法,并且发送时无需建立连接,不保证可靠数据的传输。
tcp协议和udp协议的差别
TCP UDP 是否连接 面向连接 面向非连接 传输可靠性 可靠 不可靠 应用场合 传输大量数据 少量数据 速度 慢 快
UDP一次发送的数据不能超过64KB.
UDP编程所需要的类
DatagramPacket此类表示(接收或发送的)数据报包
用于接收的构造方法
DatagramPacket(byte[] buf, int length)
构造 DatagramPacket,用来接收长度为 length 的数据包。
DatagramPacket(byte[] buf, int offset, int length)
构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。
用于发送的构造方法
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)
构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。
DatagramPacket(byte[] buf, int length, SocketAddress address)
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。
更新数据包DatagramPacket中的数据
void setData(byte[] buf)
为此包设置数据缓冲区。
void setData(byte[] buf, int offset, int length)
为此包设置数据缓冲区。
void setLength(int length)
为此包设置长度。
void setPort(int iport)
设置要将此数据报发往的远程主机上的端口号。
void setAddress(InetAddress iaddr)
设置要将此数据报发往的那台机器的 IP 地址。
获取数据包DatagramPacket中的数据
InetAddress getAddress()
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的。
byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
int getOffset()
返回将要发送或接收到的数据的偏移量。
int getPort()
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的。
DatagramSocket此类表示用来发送和接收 数据报包的套接字,核心方法:
void receive(DatagramPacket p)
从此套接字接收数据报包。
void send (DatagramPacket p)
从此套接字发送数据报包。
网络编程B/S结构知识框架学习笔记
中心主题
主题
主题
主题