码迷,mamicode.com
首页 > 其他好文 > 详细

socket编程

时间:2019-11-05 22:11:06      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:cep   学习   break   alt   状态   https   原理   address   bsp   

技术图片
1、C/S B/S架构(*****)
    c:client
    s:server
    b:browser
    学习目标:开放一个客户端软件和服务端软件,两者基于网络通信


2、什么是网络?(*****1、物理连接介质
    2、互联网协议(计算机界的英语)


3、OSI七层协议(**)
C/S
B/S
应(应、表、会):应用软件自定义协议,HTTP,FTP,HTTP+SSL
传输层:TCP、UDP,基于端口工作。机器上每起一个套接字程序都会对应一个唯一的端口号,有了端口就能找到这台机器之上唯一的一个套接字程序。

网络层:IP,基于IP地址。IP地址标识局域网地址在哪,所以有了IP和mac地址就标识了互联网中独一无二的一个计算机

数据链路层:Ethernet基于mac地址。Ethernet协议规定但凡接入互联网的机器都必须有一块网卡,每块网卡上必须有一个地址,这个地址
           就是机器的mac地址,mac地址是全世界上独一无二的地址,所以有了mac地址就能标识一个局域网中特定的一台计算机。
           Ethernet协议采用最高老的工作方式---广播:通讯靠吼,在一个局域网内有效,跨局域网时mac地址出不去。

物理层:建立物理连接,传播电信号


4、如何标识全世界范围内独一无二的一个socket程序(*****)
    ip+port


5、什么是socket(*****)
    socket是位于应用层与传输层之间的一层抽象接口层
    socket封装了tcp以下的协议,我们在编写网络通信的程序时只需要遵循socket的规范
    写出的程序自然遵循tcp或udp协议


6、TCP与UDP协议(*****)
    三次握手建连接:

    客户端给服务端发请求(syn=1,seq=x)建连接-->

                                     <--服务端同意(ack=1+x),并且向客户端发请求(syn=1,sqe=y)建连接
                                        (此时c--->s建连接成功)

    客户端回应服务端(ack=1+y)-->
       (此时s--->c建连接成功)

    注:客户端有SYN_SENT和ESTABLISHED两种状态,服务端有LISTEN、SYN_RECV和ESTABLISHED三种状态
    四次挥手断连接:

    当c-->s提交完数据时,客户端向服务端发请求(FIN=1)断连接--->
                                                            <---服务端发确认信息(ack=1),
                                                                (此时c-->s连接断开)

                                                     <---当服务端传输完数据,向服务端发请求(FIN=1)断连接
    客户端回确认信息(ack=1)--->
    (此时s---c连接断开)

    注:通常发断连接请求的是服务端,因为服务端同时会服务多个客户端,它的资源要尽可能多的腾出来给后来的客户端去用。
        状态有:FIN_WAIT_1(主动断开连接,谁先发起谁先进去这种状态,通常服务端先进入这种状态)、CLOSE_WAIT、
        FIN_WAIT_2(被动断开连接)、LAST_ACK与TIME_WAIT

    tcp:
        优点:
            发一条数据必须收对方的确认后才会从自己的操作系统缓存清楚该条消息,否则重发
            可靠协议
        缺点:
            发送数据效率必须udp低
    udp:
        优点:
            发送数据效率高
        缺点:
            发一条数据无需收到对方的确认消息,会立刻从自己的操作系统缓存清楚该条消息
            不可靠
知识点

 网络通信原理:https://www.cnblogs.com/linhaifeng/articles/5937962.html

 服务端:

import socket

server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #创建服务器套接字对象
# print(server)  #<socket.socket fd=76, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0>

#服务端和客户端都需要有ip和port,但只有服务端才绑定ip和port
server.bind((127.0.0.1,8080))
server.listen(5)  # 半连接池:限制的是请求数,而不是连接数

while True:
    conn,client_addr=server.accept() # 等待客户端发来连接请求,conn指的是双向连接(accept对应客户端的connect操作)
    print(conn)
    while True:
        try:
            data=conn.recv(1024)  #1024 接收数据的最大限制
            if not data:break  #针对linux系统
            conn.send(data.upper())  # 注意:收发都是以bytes为单位
        except ConnectionResetError:
            break
    conn.close()  #关闭客户端套接字
server.close()    #关闭服务器套接字

客户端:

import socket

client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)   #创建客户端套接字对象

client.connect((127.0.0.1,8080))  #发起连接

while True:
    msg=input(>>: ).strip()
    client.send(msg.encode(utf-8))
    data=client.recv(1024)
    print(data.decode(utf-8))

client.close()  #关闭客户端套接字

 注:

技术图片

socket编程

标签:cep   学习   break   alt   状态   https   原理   address   bsp   

原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/11799390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!