python学习27天----网络基础

1.网络开发架构

1)C/S架构:客户端/服务端(client/server)

          C/S优点:客户端能充分发挥PC的性能

2)B/S架构:浏览器/服务器(brower/server)隶属于C/S架构

              B/S优点:统一了应用的接口

2.网络通信

1)同一个电脑两个py程序通信:2个py文件同时操作1个文件,一个读,一个写

2)两个电脑通信

3)多个电脑通信:局域网(交换机)---二层通信原理

2.Socket(套接字)

1)接口:别人写好的功能,自己去调用,这个功能的名字就是接口

print(‘abc’)调用了系统中的标准输出,所以可以打印内容,即print调用了这个接口

import sys
print('abc')
sys.stdout.write('abc')
输出:
abc
abc
View Code

2)socket感念

              Socket是应用层与TCP/IP协议簇通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,他把复杂的TCP/IP协议隐藏在Socker接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议

①基于文件类型的套件字(AF_Unix):socket是源自于unix系统而研发的功能,主要是为了同一台电脑上,多个程序直接通信

②基于网络类型的套接字(AF_INET)

3)socket层

通信类的程序想要实现通信必须要调用Socket(里面提供了一系列的方法),根据业务不同的传输模式(tcp/udp),在编写程序过程中,只关注发送的程序和发送所需要的协议,其他不用关注

4)协议类型(type)

①tcp:SOCK_STREAM

②udp: SOCK_DGRAM

3.Socket

1)服务端和客户端的连接

#server.py
import socket
import  time
sk = socket.socket()   #包.类  不传参数,默认使用基于网络的套接字,使用TCP模式
#socket默认参数:family=AF_INET(基于网络的scoket), type=SOCK_STREAM(TCP模式), proto=0, fileno=None
sk.bind(('192.168.43.223',18800)) #服务端的IP和开启的端口
sk.listen() #监听,同时能接受的连接(即A能访问百度,B也能访问百度)
print("连接前。。。")
conn,addr = sk.accept() #等待接受客户端的连接,程序阻塞等待(之前的程序执行,之后的在客户端连接后执行)
print("连接后。。。")
print("conn:%s",conn)
print("addr:%s",addr)
time.sleep(20)
conn.close()
sk.close() #关闭连接
#client.py
import socket
import time
sk = socket.socket()
sk.connect(('192.168.43.223',18800))
time.sleep(20)
sk.close()
#输出:
连接前。。。
连接后。。。
conn:%s <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('192.168.43.223', 18800), raddr=('192.168.43.223', 51742)>
addr:%s ('192.168.43.223', 51742)
View Code

2)客户端和服务端的数据发送和接受

#server.py
import socket
import  time
sk = socket.socket()                 #买一个手机
sk.bind(('192.168.43.223',18800))   #买一个手机卡
sk.listen()                         #开机
conn,addr = sk.accept() #等待连接     #等待朋友打电话
str = conn.recv(1024) #等待接受服务器的大小,单位为字节   #
str2 = conn.recv(1024)
print(str.decode("utf-8"))
# print(str2.decode("utf-8"))
conn.close()                       #挂掉电话
sk.close() #关闭连接                #关机
#client.py
import socket
import time
sk = socket.socket()
sk.connect(('192.168.43.223',18800))
sk.send(b"Hello World !!!") #客户端发送的数据必须为bytes类型,否则无法传输
sk.send("你好,世界".encode("utf-8"))
sk.close()
#输出:
Hello World !!!你好,世界
View Code

sk = socket.socket(family=AF_INET,type=SOCK_STREAM)

4)协议类型(type)

①tcp:SOCK_STREAM

②udp: SOCK_DGRAM

5)fimaly

①AF_unix

②AF_INET

重点总结:

①arp协议

②路由器、交换机区别

③tcp协议和udp协议的特点及tcp协议的编码

④TCP/IP五层模型

练习:

1)客户端和服务端持续通信,当一段输入q时两端退出

#server.py
import socket
import  time
sk = socket.socket()
sk.bind(('127.0.0.1',18800))
sk.listen()
conn,addr = sk.accept() #等待连接
while True:
    str_out = conn.recv(2048).decode("utf-8") #等待接受数据的大小,单位为字节
    if str_out == 'q':
        break
    else:
        print(str_out)
    str_in = input(">>>")
    conn.send(str_in.encode("utf-8"))
    if str_in == "q":
        break
conn.close()
sk.close()
#client.py
import socket
import time
sk = socket.socket()
sk.connect(('127.0.0.1',18800))
while True:
    str_in = input(">>>")
    sk.send(str_in.encode("utf-8")) #客户端发送的数据必须为bytes类型,否则无法传输
    if str_in == 'q':
        break
    str_out= sk.recv(2048).decode("utf-8")
    print(str_out)
    if str_out=='q':
        break

sk.close()
View Code

2)一个服务器轮流的和多个客户端进行通信(只需要在服务端加一个while循环即可)

python.py
import socket
import  time
sk = socket.socket()
sk.bind(('127.0.0.1',18800))
sk.listen()
while 1:
    conn,addr = sk.accept() #等待连接
    while True:
        str_out = conn.recv(2048).decode("utf-8") #等待接受数据的大小,单位为字节
        if str_out == 'q':
            break
        else:
            print(str_out)
        str_in = input(">>>")
        conn.send(str_in.encode("utf-8"))
        if str_in == "q":
            break
    conn.close()
sk.close()
View Code
原文地址:https://www.cnblogs.com/piaolaipiaoqu/p/14304271.html