标签:病毒 bytes lock put asp 控制 nta 响应 缓冲
我们将多台计算机按照一定的模式连接到一起的一种方式
同一个网络中的计算机可以相互进行访问
资源共享
均衡负荷与分布处理
由于结点之间联系很复杂,在制定协议时,把复杂成份分解成 一些简单的成份, 再将它们复合起来。最常用的复合方式是层次方式,即同层间可以通信、上一层可以调 用下一层,而与再下一层不发生关系。
物数网传会表应
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
网络硬件人员需要具备的条件
作为Java程序员了解即可?除非你给妹子接网线
我们网络中有可能有很多的机器,如何唯一性的定位到你
定位网络中的一台机器
IP
Internet protocol网络协议
IP分为IP4和IP6
最初的是IP4占用4个字节,一个字节是[0-255].于是IP4的取值为
一个企业也只占用几个公网IP
因为IP4不够用了,于是诞生了IP6 ,IP6占用16个字节
但是现在正处于ip4到ip6的转换过程中,需要一定的时间
port
因为一台服务器只有一个IP,所以导致当别人访问这台服务器的时候
我们还需要区分是访问的那个应用
端口占用2个字节,范围是[0-65535] ,我们可以把一个应用绑定在一个端口上
当别人访问这个端口的时候,就可以直接访问这个应用
不要使用1024之下的端口,系统保留端口
IP是为了定位一台电脑,端口是为了定位一个应用
DNS
域名系统(服务)协议
是为了更好的记忆IP地址
域名解析服务器:可以将域名解析成IP地址,以前有很多病毒专门做Hosts欺骗
InetAddress
获取指定的IP地址,只通过IP定位到某一个主机
public class NetDemo01 {
public static void main(String[] args) throws UnknownHostException {
//static InetAddress getLocalHost() 返回本地主机的地址。
InetAddress i1 = InetAddress.getLocalHost();
System.out.println(i1); //DESKTOP-P04TCL5/192.168.14.111
//static InetAddress getByName(String host) 决定了IP地址的主机,主机的名字。
InetAddress i2 = InetAddress.getByName("www.baidu.com");
System.out.println(i2); //www.baidu.com/180.101.49.12
System.out.println(i1.getHostName()); //DESKTOP-P04TCL5
System.out.println(i1.getHostAddress()); //192.168.14.111
InetSocketAddress
不但可以获取IP地址,还可以使用端口进行定位
可以直接定位到某一个应用
URL--URI
统一资源定位符
http://tool.cncn.com/youbian/100086
http:// 传输协议
tool.cncn.com IP地址 :80 默认网络传输的端口号为80
/youbian/100086 资源位置
https://www.ip138.com/post/search.asp?area=100086&action=area2zone
https:// 传输协议
www.ip138.com DNS -->IP地址 104.24.98.161 :80 端口号
search.asp 资源位置
?area=100086&action=area2zone 请求的参数
这个资源的定位是全网统一的,每一个资源在网络上都有一个唯一的定位
public class URLDemo03 {
public static void main(String[] args) throws MalformedURLException {
//URL(String spec)
URL url = new URL("http://www.baidu.com:80/index.html?name=zhangsan&pwd=123#a");
System.out.println(url);
//getProtocol() 协议
System.out.println("协议:"+url.getProtocol());
System.out.println("域名:"+url.getHost());
System.out.println("端口:"+url.getPort());
System.out.println("资源:"+url.getFile()); ///index.html?name=zhangsan&pwd=123
System.out.println("文件:"+url.getPath());
System.out.println("数据:"+url.getQuery());
System.out.println("锚点:"+url.getRef());
TCP
传输控制协议
包含: http https ftp smtp
数据相对安全的一种协议,基于连接的,如果使用tcp协议传输数据,必须先建立连接,然后发送数据
TCP相当于打电话
三次握手,四次挥手
建立连接时
1客户端发送一个连接请求到服务器
2服务器检查自己并返回一条响应信息
3客户端发送消息确认建立连接
断开连接时
1客户端发送请求说要断开连接
2服务器开始受到请求,检查是否有未传输的数据
3服务器检查完毕,确认断开
4客户端也确认断开连接
安全,但是效率有点低,后面专门做了一些优化措施
UDP
用户数据包
基于数据包发送的协议,我们的目的就是发送出去数据包
UDP相当于发短信
相对效率较高,但是不安全
对应的程序使用到网络传输的数据
UDP实现基本流程: 发送端
1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
2.准备数据--> 转为字节数组
3.打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) 构造一个数据报包发送数据包的长度 length抵消 ioffsetto指定主机上的指定端口号。
4.发送数据 send(DatagramPacket p) 从这个套接字发送一个数据报包。
5.关闭
public class UDPSend01 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是发送端------------------");
//1.定义发送端 DatagramSocket(int port) 指定发送端ip和端口
DatagramSocket send = new DatagramSocket(7777);
//2.数据
byte[] msg = "Hello".getBytes();
//3.打包
DatagramPacket packet = new DatagramPacket(msg,0,msg.length,new InetSocketAddress("localhost", 8888));
//4.发送
send.send(packet);
//5.关闭
send.close();
}
}
UDP实现基本流程: 接收端
1.构建接收端
2.准备包裹-->用来接收数据
3.接收
4.处理数据
5.关闭
public class UDPReceive02 {
public static void main(String[] args) throws IOException {
System.out.println("--------------我是接收端-----------");
//1.构建接收端
DatagramSocket receive = new DatagramSocket(8888);
//2.准备包裹-->用来接收数据
byte[] arr = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(arr,arr.length);
//3.接收
receive.receive(packet);
//4.处理数据
/*
* byte[] getData()
返回数据缓冲区。
int getLength()
返回将要发送或接收到的数据的长度。
*/
byte[] result = packet.getData();
int length = packet.getLength();
System.out.println(new String(result,0,length));
//5.关闭
receive.close();
}
}
tcp基于IO流操作
TCP 基本流程: 客户端
1.创建客户端 Socket(String host, int port) 指定服务端的IP+端口
2.获取IO流
3.写出数据
4.关闭
public class TCPClient03 {
public static void main(String[] args) throws UnknownHostException, IOException {
String name = "aaa";
String pwd = "123";
System.out.println("---------------client--------------");
//1.创建客户端
Socket client = new Socket("127.0.0.1",8888);
//2.获取输入流
OutputStream os = client.getOutputStream();
//3.写出数据
os.write(("name="+name+"&pwd="+pwd).getBytes());
os.flush();
//获取输入流读取服务端响应
InputStream is = client.getInputStream();
byte[] car = new byte[1024];
int len = is.read(car);
System.out.println(new String(car,0,len));
//4.关闭
is.close();
os.close();
client.close();
}
}
tcp基于IO流操作
TCP 基本流程: 服务端
1.创建服务端 ServerSocket(int port) 创建绑定到特定端口的服务器套接字。 服务端的端口号
2.阻塞式监听
3.获取IO流
4.读入数据
5.操作数据
6.关闭
public class TCPServer04 {
public static void main(String[] args) throws IOException {
System.out.println("---------------Server--------------");
//1.创建服务端
ServerSocket server = new ServerSocket(8888);
//2.阻塞式监听
Socket client = server.accept();
System.out.println("-----------有一个客户端连接成功----------");
//3.获取IO流
InputStream is = client.getInputStream();
//4.读入数据
byte[] car = new byte[1024];
//把数据读入到字节数组car中,返回值len为读入到字节数组中真实数据的长度
int len = is.read(car);
String name =null;
String pwd =null;
//5.操作数据
String str = new String(car,0,len);
//分割数据 name=aaa&pwd=123
String[] arr = str.split("&");
for(String s:arr) {
String[] ss = s.split("=");
//判断当前这个ss[1]是名字的值还是密码的值
if("name".equals(ss[0])) {
name = ss[1];
}else {
pwd = ss[1];
}
}
System.out.println(name);
System.out.println(pwd);
//获取输出流
OutputStream os = client.getOutputStream();
//校验
if("111".equals(name) && "123".equals(