网络编程

1. 网络概述

1.1 概述

1.1.1什么是网络?

早期的计算机都是互相独立的一套一台以数据运算为主的机器。随着时代的变迁。用于进行运算的数据的共享需求变得更加迫切。于是有人通过物理线路将多台计算机连接起来组成一个互联计算机平台,实现了多台计算机之间特定的数据交互模式,这就是最早期的网络和它的意义!

但是这样原始的连接操作方式非常简陋,同时对于连接的计算机要求进行改造以适应某个连接场合!极大程度的限制了数据共享的范围和计算机的普遍适用性能!

在为了迫切的数据通信共享需求的刺激下,计算机网络技术有了快速的发展同时也取得了非常有意义的成果,为了能在众多计算机中找到特定的计算机, Vint cerf 在实验室模拟阶段使用了32位标记的网络地址协议【internet protocal】,用于标识网络上唯一的一台计算机了,也就是后来的ip地址;

为了能在一台计算机中找到特定的某个程序,将计算机中的每个和外界连接的程序设定了数据通信的通道,也就是后来经常听到的端口 port;

同一时间国际标准化组织 ISO 为了大家鞥呢方便的在网络上进行数据的创术通信,定义了网络数据传输模型,就是经典的OSI/RM 参考模型,模型规范了适用于不同网络层级的创术协议,方便大家可以通过不同的斜体进行数据的有效传播共和共享!

1.1.2 客户端 & 服务端

什么是客户端?什么是服务端?
对于不同的人不同的角度李连杰起来会有很多种含义,首先先明确一下关于客户端和服务端的本身的意义:
在生活场景中,提供各种人们需要的服务的人群属于服务员,对应了软件中的服务端,如餐厅服务员提供就餐服务、售票中提供售票服务等等;另外一部分消费者人群是享受这些服务的,对应了软件中的客户端;理想情况下服务端要求二十四小时不间断提供服务,因为你根本不确定客户端会在什么时刻需要访问这些服务!

在计算机中,客户端和服务端的架构模式,区分为硬件模式和软件模式

(1)硬件客户端/服务端
这种模式下,一台机器可以作为提供服务的机器,如同我们生活中的打印机就是一个硬件服务器,在计算机通过网络传输给打印机具体的数据时,打印机就会工作提供打印服务

更多的是运行在网络上的各种硬件服务器,如CDN服务器【网络文件分发服务器】,将我们需要的各种组员文件存储在网络上的一台主机中,在使用的时候只需要通过每个文件对应的一个url地址进行访问即可,如FTP服务器【文件创术服务器】,将我们的九三级文件尅也存放在这样的服务上,并且在联网的情况下可以向操作本地计算机文件一样操作他们。给我们的生活带来了非常友好的帮助!

工作在网络上的硬件服务器,通常情况下也会根据在服务器上安装的特定软件和应用场景来命名不同性质的服务器名称,如:web服务器、数据库服务器、大理服务器等等

(2)软件客户端/服务端
软件服务器和硬件服务器不同的是:软件服务器是安装哎硬件上的一种特殊的软件,可以通过程序的执行完成数据检索、数据处理、数据存取等等各种特性,再通过网络进行数据的共享通信,完成提供网络数据服务的功能!

常见的如web 软件服务器。主要是讲一个服务器软件暗黄在网络上的应阿金主机上,然后就可以再web服务器中添加网站程序,启动一个网站来个用户提供各种服务惭怍;数据库软件服务器,将数据库软件安装在硬件主机上,提供数据的存取服务等等

1.2 IP &PORT

1.2.1 IP地址

ip :internet protocal 网络互连协议,中文缩写:网协

网络互连协议就是为了多台计算机能够在网络中进行网络互联通信而舌一的协议,是能够使得网络上工作的任意一台计算机可以和其他计算机之间实现网络通信的一套通用规则,任何计算机制造厂商生产的计算机必须遵守这套规则的情况下,就可以接入现行的网络实现联网通信的功能!
(1)ip赋值根据使用的用户性质的不同,主要区分为5类ip地址
A类地址 0 网络地址7位 主机地址24位
B类地址 10 网络地址14位 主机地址16位
C类地址 110网络地址21位 主机地址18位
D类地址 1110 多目的广播地址28位
E类地址 11110 保留用于试验和将来使用

A类地址一个A类ip地址由1字节的网络地址和3字节的主机地址组成,网络地址的最高位必须是“0”,地址范围从1.0.0.0 到123.0.0.0.可用的A类网络有126个,每个网络能容纳1亿多个主机

B类ip地址 一个B类ip地址由2个字节的网络地址和2个字节的主机地址组成, 网络地址的最高位必须是“10”,地址范围从128.0.0.0到191.255.255.255.可用的B类网络有16382个,每个网络能容纳6万多个主机

C类ip地址 一个C类ip地址由3字节的网络地址和1字节的主机地址组成,网络地址的最高位必须是“110”。范围从192.0.0.0到223.255.255.255.C类网络可达209万余个,每个网络能融安254个主机

D类地址用于广播.D类ip地址第一个字节以“1110”开始,它是一个专门保留的地址。它并不指向特定的网络,目前这一类地址被用在多点广播中,多点广播地址用来一次寻址一组计算机,它标识共享同意协议的一组计算机。224.0.0.0到239.255.255.255用于广播地址

E类ip地址以“11110”开始,为将来使用保留。240.0.0.0到255.255.255.254
255.255.255.255用于广播地址

全零(“0.0.0.0”)地址对应于当前主机。全“1”的ip地址(“255.255.255.255”)是当前子网的广播地址

私有地址:适用于局域网络的地址
在IP地址3种主要类型里,个保留了3个区域作为私有地址,其地址范围如下:A类地址:10.0.0.0~10.255.255.255
B类地址:172.16.0.0~172.31.255.255
C类地址:192.168.0.0~192.168.255.255

本机地址:使用与当前主机进行网络回路测试
ip地址为127.0.0.1~127.255.255.255

子网掩码:专门针对不同类型的ip地址进行的网络地址和主机地址的规则定义

一个有效的ip地址,为了方便在网络上被寻址,通常情况包含三个部分:

  类型标志
  网络地址
  主机地址

类型标志有着非常明确的规范,网络地址和主机地址的区分主要通过子网掩码进行划分 子网掩码和ip地址一样都是32位,左边为1用来表示网络地址,右边为0表示主机地址

某台主机ip地址:192.168.1.100
子网掩码:255.255.255.0

此时子网掩码对ip地址进行了划分,左边24位为网络地址,右边8位为主机地址 通常情况下我们所说的在不在一个网段,说的就是不是在用一个网络地址下!

1.2.2 port端口

在通过ip地址确定了网络上的某个具体主机之后,具体的数据通信主要是通过工作在计算机中的软件执行的,不同的软件通信很容易造成问题

结合生活场景,计算机中出现了端口的概念,端口port主要是用于区别不同的软件的通信渠道,用于正确的将刷机通过制定的端口渠道传输给对应的软件!

(1) 不同的端口号分类
计算机中的端口号的范围是0~65535之间

端口号根据其使用场景,一般区分为公用端口,动态端口,保留端口

公用端口:0~1023
动态端口:1024~65535
保留端口:一般是unix系统中超级用户进程分配保留端口号

常见端口号:
21 FTP文件传输端口
22 ssh服务端口
23 telnet服务端口
25 smtp邮件服务端口
80 http超文本传输协议端口
110 pop3邮局协议端口
115 sftp安全文件传输协议端口欧
443 https安全超文本传输协议端口

1.3 协议

1.3.1 什么是协议

通常情况下为了让工作在网络中的多台计算机之间能友好的完成不同软件的数据的通信,出现了互联网数据传输协议的概念,通过协议的约束,不同地域环境的计算机可以通过网络完成流畅的正确的数据交互

计算机网络数据传输协议目前最主流的就是欧洲计算机制造协会联盟,也称为国际标准化组织ISO指定的OSI/RM七层网络传输模型!

1.3.2 OSI/RM 模型

国际标准化组织根据用户从操作应用程序到数据经过物理线路的传输通信,将网络数据传输划分成了七层模型(也有五层模型,四层模型的概念,都是从七层模型的基础上再次抽象出来的,通过不同层级模型的协议规范,将数据的传输进行了标准化处理,任何厂商生产的计算机都必须遵守这样的规范,才能在互联网中满足和其他计算机实现网络互联数据共享通信的功能。)
提供应用程序之间的通信
应用层-------------------------------------------------应用层
梳理数据格式、数据加密
表示层-------------------------------------------------表示层
建立、维护、管理会话
会话层-------------------------------------------------会话层
建立主机端到端连接
传输层-------------------------------------------------传输层
寻址和路由选择
网络层-------------------------------------------------网络层
提供介质访问、链路管理等
数据链路层--------------------------------------数据链路层
比特流二进制数据传输
物理层-------------------------------------------------物理层

1.3.3 协议族

协议通常指代单独的一个协议,协议族通常指代互相关联的一组协议,协议栈指代某一组互相关联的协议和她们所属的OSI模型的层级结构
应用层【应用层、表示层】
传输层【公话层、传输层】
网络层【网络层】
链路层【数据链路层、物理层】

1.3.4 常见网络传输协议

HTTP 超文本传输协议
HTTPS 提供安全通道的超文本传输协议
FTP 文件传输协议
TELNET 虚拟终端协议

SSH 安全外壳协议
pop3 邮局协议
smtp 简单邮件传输协议
IP 数据包交换协议
TCP 端对端传输协议
UDP 数据广播协议
DNS 域名解析协议,可以通过nslookup查看域名解析信息
DHCP 动态主机配置协议

2.PYTHON传输层网络编程

(1)传统网络编程
(2)非阻塞异步网络编程

底层通过套接字socket对象的连接,完成多种协议的网络程序服务端/客户端的开发和数据通信

2.1socket

2.1.1socket的由来

socket最初是为同意主机上的应用程序创建,是主机上运行的一个程序与另一个程序之间可以完成数据通信操作 程序也成为进程,就出现了不同进程间进行数据交互的操作,因为交互和的模式不同,所以也一般讲程序中的套接字区分为两种

(1)面向文件的套接字:通过文件进行数据交互
(2)面向网络的套接字:通过网络进行数据交互

套接字最初出现之后,为了区分不同平台不同体系的套接字模型对象,定义了地址家族的概念:Adress Family 也经常简写为AF
Unix系统中的套接字就是第一种家族套接字,成为AF_UNIX 或者AF_LOCAL,这是POSIX1标准中规范的

同样也有一些体系平台下,对于套接字的划分通过协议家族进行规范,可以简写问PF,考虑到兼容性的要求,PF和AF在一些平台上都继承了互相兼容的实现,我们的python本身支持的是更加标准化的AF地址家族

另一种地址家族就是面向网络的套接字模型对象了。经典的如AF_INET支持的是传统第四个版本的因特网协议寻址【IPV4】,同时也提供了AF_INET6用于支持第六个版本的因特网协议寻址【IPV6】

2.1.2.PYTHON中的套接字

套接字模型对象,为了能明确的表示网络中一台数据交互的主机,需要通过IP地址寻址确定主机位置,通过PORT端口号确定主机交互接口

在网络套接字交互过程中,出现了两种类型的套接字模型
(1)面向连接的套接字模型
面向连接的套接字模型,在进行网络数据传输过程中,首先要创建一个连接模型,通过指定的连接模型进行数据的交互,类似我们生活中拨打电话一样,首先保证通话连接的基础上才能完成通话内容的交互,
比较经典的如TCP端对端传输协议就是面向连接的套接字对象
(2)面向无连接的套接字模型
面向无连接的套接字模型,在进行网络数据传输过程中,不需要有效的网络连接模型,在数据传输过程中只负责发送/接送,不保证数据的完整性和实效性,类似我们生活中的广播电台,电视信号等等,从挨揍效率要比面向连接的套接字模型更加高效;比较井底那的UDP广播些而已使用的就是面向无连接的套接字对象

python中提供的网络连接套接字。主要包含在socket模块中
socket模块提欧共了socket()函数可以完成如上描述的各种网络套接字的构建、通信等操作
(3)基本语法结构
创建TCP协议的套接字socket对象
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
创建UDP协议的套接字socket对象
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.1.3 socket套接字常用操作

s.bind() 绑定(主机名称、端口、)到一个套接字上
s.listen()设置并启动TCP监听
s.accept()等待客户端连接
s.connect() 连接指定服务器
s.connect_ex()连接指定服务器,如果出现错误返回错误信息
s.recv()接受TCP消息
s.recv_into 接受TCP消息到缓冲区
s.send()发送TCP消息
s.sendall()完整发送TCP消息
s.recvfrom()接受UDP消息
s.recvfrom_into接受UDP消息到缓冲区
s.sendto()发送UDP消息
s.shutdown()关闭连接对象
s.close()关闭套接字对象

2.2 TCP编程

TCP:Transmission Control Protocal 传输控制协议
是一种面向连接的、可靠的、基于字节流的传输层通信协议

数据传输的可靠性的处理方式,经典的TCP模型中通过如下两种方式完成连接的可靠性
(1)三次握手建立连接
1.A->B:发送一个寻址请求码seq = 100;B->A;返回一个应答ack = 101
A->B:发送一个确认请求码seq = 101,确认连接;B->A;返回应答ack = 300
A->B:发送一个连接请求码ack = 300;B->A;返回 应答ack = 80
A和B之间开始进行数据交互
(2)四次回收断开连接
A->B:发送一个数据验证请求码seq = 100,B->A:返回一个应答ack = 101
A->B:发送一个传输结束标记:seq = 101;B->A;返回一个应答ack = 200
A->B:发送一个确认结束标记:seq = 200;B->A:返回一个应答ack = 300
A->B:发送连接断开标记:seq =300;B->A:返回断开连接应答:ack = 400

正式有了三次握手和四次回收对于连接可靠性的保障,才让TCP协议端对端的数据交互变得可行,但是同样由于该协议的国语可靠,被有心人利用将会经常实施DDOS拒绝服务攻击!(也被称为洪水攻击!)

2.2.1服务端开发

服务端,就是提供服务的一端,服务端的编程操作步骤如下:
定义需要监听的主机IP和端口号
绑定IP地址和端口号到套接字对象
开始监听
等待连接
连接成功--开始数据通信
断开连接
实例代码:

import socket
  #定义主机连接信息
HOST = ""
PORT = 8888
ADDRESS = (HOST,PORT)
BUFF = 1024
#创建tcp连接套接字对象
tcp-server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定主机端口
tcp_server.bind(ADDRESS)
#开始监听:参数~允许接入的客户端数量(多个客户端排队连接)
tcp_server.listen(2)

while True:
    print("waiting for connect....")
    #等待客户端的接入
    sk.addr = tcp_server.accept()
    print("welcome",addr)
    while True:
        #给客户端发送消息
        sk.send("hello  my   name  is server19881",encode("utf-8"))
        #接受客户端的消息
        msg = sk.recv(BUFF)
        print(msg)
        if msg = b"BYE":
              break
        #关闭套接字,释放资源
        sk.close()
tcp_server.close()
2.2.2客户端开发

满足TCP协议的客户端,主要操作方式是主动发起请求连接服务器完成和服务器的连接之后,进行和服务器之间的通信

开发步骤如下:
创建TCP连接套接字对象
向指定的IP 和PORT发起请求,请求连接
连接成功,进行数据收发操作
关闭连接,释放资源

实例代码开发:

import  socket
#定义连接目标主机的ip地址和端口
HOST = '192.168.1.107'
PORT = 8888
ADDRESS = (HOST,PORT)
BUFF = 1024
#创建TCP连接socket套接字对象
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#开始向目标主机发起连接
client.connect(ADDRESS)

while True:
    #接受服务器发送的消息
    msg = client.recv(BUFF)
    print(msg)
    #向服务器发送消息
    info = input("输入您要发送的消息:")
    client.send(info.encode("utf-8")
    if info == "BYE":
        break
#关闭套接字,释放资源
clinet.close()

2.3 UDP编程

UDP:User Datagram Protocal 用户数据报协议
是OSI/RM模型中隶属于传输层的面向无连接的网络数据传输协议

UDP协议本身没有连接可靠性的保证,没有数据顺序ACK记录,没有数据重发机制,因为没有那么多的数据创术控制特性,所以UDP进行数据传输过程中延迟较小,数据创术效率较高,比较适合对可靠性要求不是很高的程序!

由于UDP面向无连接的特性,在编程处理的过程中,服务端和客户端的操作模式类似,唯一的区别就是服务端需要主动等待客户端发送消息,要将自己的AF暴露给客户端操作

2.3.1服务端开发

UDP服务端开发步骤如下:
引入依赖的模块
定义服务器描述信息
创建UDP套接字对象并绑定主机
消息循环:和连接进入的客户端之间发送/收取消息
关闭连接,释放资源
实例代码开发:

#引入需要的模块
import socket
 #定义服务器描述信息
  HOST = ""
  PORT = 8080
  ADDRESS =  (HOST,PORT)
  BUFFER = 1024
 #创建UDP套接字对象,并绑定当前主机
udp_server = socket,socket(socket.AF_INET.socket.SOCK_DGRAM)
udp_server.bind(ADDRESS)
#消息循环
while True:
    #接受消息
    print("waiting for message from client...")
    msg,addr = udp-server.recvfrom(BUFFER)
    #打印展示消息
    print(“client”,msg)
    #发送消息
    udp-server.sendto("hello , my name is server",encode("utf-8"),addr)
udp_server.close()
2.3.2客户端开发

客户端的开发更加简单,只需要明确目标主机信息
就可以完成和目标主机之间的消息发送/收取
客户端编程实现:

#引入需要的模块
import socket
#定义目标主机信息
HOST = '192.168.1.107'
PORT = 8080
ADDRESS = (HOST,PORT)
BUFFER = 1024
#创建UDP套接字对象
udp_client = socket.socket(socket.AF_INET,socket.SOCKET_DGRAM)
#消息循环
while True:
    msg = input("please enter the  message for send:")
    udp_client.sendto(msg.encode("utf-8"),ADDRESS)
    if msg == "BYE":
        break
    info = udp_client,recvfrom(BUFFER)
    print("server",info)
udp_clinet.close()

2.4socketserver

2.4.1 socketserver 概述

socketserver是python中提供的一个可以用于面向对象服务端开发的一个高级模块,封装了底层socket的大量操作实现,通过提供面向对象的操作方式简化程序开发

2.TCP编程

基于socketserver的TCP服务端的编程开发

#导入依赖的模块
import socketserver
#定义服务主机信息
HOST = '192.168.1.107'
PORT = 8080
ADDRESS = (HOST,PORT)
BUFFER = 1024
#自定义处理类
class MyRuestHandler(socketserver.StreamRequesHandler):
    #定义处理方法
    def handle (self):
        #通过clinet_address属性查看连接进来的服务器  
        print("连接上的服务器:%s”%str(self.client_address)
        #接受客户端发送的数据
        msg = slef.request.recv(BUFFER)
        print("客户端发过来消息:%s”%msg.decode("utf-8")
        #给客户端返回接受信息
        self.request.sendall("已经成功接受您发送的消息”.encode("utf-8")
#程序从主线程直接运行
if __name__ == "__main__":
    #创建服务端对象,指定处理类,并监听8888端口
    server = socketserver.TCPServer(ADDRESS,MyRequesHandler)
    print("server is starting waiting for connect........")
    #启动服务端程序
    server.serve_forever()

客户端的操作也相对比较简单,唯一需要注意的是:使用TCPServer构建的TCP服务端在和客户端进行数据通信的过程中,每一次的数据通信都会使用一个新的套接字对象,所以客户端程序需要改造~每次和服务器进行数据交互式都需要创建一个新套接字

#导入需要的模块
import socket
#定义主机信息
HOST = '192.168.1.107'
PORT = 8080
ADDRESS = (HOST,PORT)

#消息循环
while True:
    创建一个TCP套接字对象
    client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    #连接目标主机
    client.connect(ADDRESS)
    #消息收发
    msg = input("enter message")
    client.send(msg.encode("utf-8"))
    if msg == "BYE":
        break
    info = clinet.recv(1024)
     print(info)
    关闭套接字
    client.close()

2.4.3 UDP编程

在socketserver中UDP编程方式和TCP编程操作方式及其类似
服务端的开发

#引入依赖的模块
from socketserver import(UDPServer as UDP,DatagramRequesHandler as DRH)
#服务器描述信息
HOST = '192.168.1.107'
PORT = 8888
ADDRESS = (HOST,PORT)
#自定义消息处理类
class MyRequesHandler(DRH):
    #消息处理函数
    def handle(self):
        pirint(('客户端接入成功,开始收发消息:', self.client_address)
        # 接受消息
        msg = self.rfile.readline()
        print(msg.decode('utf-8'))
        #发送消息
        slef,wfile.write("my name is server,服务器”.encode(“utf-8”))
if __name__ == "__main__":
    #创建UDP服务器
    udp_server = UDP(ADDRESS,MyRequesHandler)
    print("server is starting......)
    #启动udp服务器
    udp_server.serve_forever()

客户端开发

import socket

HOST = '192.168.1.107'
PORT = 8888
ADDRESS = (HOST,PORT)

while True:
    client = socket.socket(socket.AF_INET,socket_SOCK_DGRAM)
    #发送消息
    info = input("enter message:")
    client.endto(info,encode("utf-8"),ADDRESS)
    #接受消息
    msg,addr = client.recvfrom(1024)
    print(addr,"say:",msg)
    client.close()

3.PYTHON应用层网络编程

前面描述的基于TCP/UDP协议的网络程序开发,主要是针对传输层协议的底层代码实现在实际操作过程中,更多的情况是直接操作应用层的数据协议的网络程序开发,如文件传输协议FTP,邮件协议SMTP等等
这一部分针对应用层的协议下网络程序的开发做一个深入的处理

3.1 FTP文件服务

FTP:file Transfer Protocal 文件传输协议
工作在应用层的协议,FTP协议主要用于匿名下载文件或者在两台计算机之间进行文件的传输工作!

FTP协议底层采用的是TCP协议完成的网络数据传输,为了方便两天计算机上的文件正确的进行交互,FTP协议封装了连个套接字完成文件操作,第一个工作在21端口的套接字专门用于传输命令控制指令,第二个工作在20端口的套接字专门传输具体文件数据

3.1.1 FTP客户端程序开发

FTP网络程序的开发,我们不需要关注服务端的程序,服务端的软件程序开发和文件管理操作可以有大量的现成的工具去操作完成,而FTP如果作为应用软件的一部分功能,客户端程序的操作才是因公用软件中最常见的的操作
PYTHON中提供了对FTP操作友好的支持,通过内建标准模块ftplib提供
针对FTP客户端的逻辑流程,进行如下步骤分析:
客户端——连接到服务器
客户端——账号+密码登录服务器
发出服务请求——控制指令、数据传输指令——处理响应数据
客户端退出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容

  • 引言 网络学习的核心内容就是网络协议的学习 网络协议:网络中进行数据交换而建立的规则、标准或者说是约定的集合因为不...
    _凉风_阅读 1,878评论 8 22
  • 网络编程的概述 网络编程的实质就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。 一.OSI网络模型...
    思念挥霍阅读 358评论 0 0
  • 一、网络通信协议 定义:对数据的传输格式、传输效率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换,...
    聂叼叼阅读 476评论 0 2
  • 网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编...
    程序员欧阳阅读 1,969评论 1 37
  • 计算机网络概述 网络编程的实质就是两个(或多个)设备(例如计算机)之间的数据传输。 按照计算机网络的定义,通过一定...
    蛋炒饭_By阅读 1,175评论 0 10