python之网络编程1-socket-tcp与udp

一、概念

两个独立python文件之间可以通过写入文件,读取文件进行交互
由于不同机器上的程序要通信,才产生了网络
B/S架构统一入口,各种小程序和公众号
服务端 一直运行,等待服务别人
客户端 用的时候,才使用服务
想要实现通信
网卡 和 网线
网卡上有全球唯一的mac地址(物理地址)
4个点分十进制
4个八位二进制:00000000.00000000.00000000.00000000
0.0.0.0-255.255.255.255
通过ip地址就能找到对应的mac地址:遵循arp协议
交换机-多台机器间的通信问题:广播风暴
网关:局域网中的机器想要访问局域网外的机器,需要通过网关访问
子网掩码与IP地址进行按位与 运算  得到网段地址:可判断电脑是否在同一个网段内
端口:找到的程序
在同一时间只会有一个程序占用一个端口
不可能在同一时间 有两个程序 占用同一个端口
端口范围:0-65535
一般用8000之后的端口

ip:确定唯一一台机器
127.0.0.1 本地的回环地址
端口:确定唯一的一个程序
ip+端口:找到唯一的一台机器上的唯一的一个程序

二、socket初认识

server端:

#server端
import socket
sk=socket.socket()  #sk为手机对象
# sk.bind('ip','port') #绑定手机号
sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)  # 避免服务重启的时候报address already in use
sk.bind(('127.0.0.1',8080))
sk.listen()  # 监听。等电话过程
conn,addr=sk.accept()  #接收到别人电话  connection连接,与它连接的address地址
print(addr)
while True:
    # ret=conn.recv(1024)     # 听别人说话
    # print(ret)
    # conn.send(b'hi')          # 我和别人说话,必须传一个bytes类型
    # ret=conn.recv(1024)
    # print(ret.decode('utf-8'))
    # conn.send(bytes('大碗油泼面',encoding='utf-8'))
    ret=conn.recv(1024).decode('utf-8')
    if ret=='bye':
        break
    print(ret)
    info=input('>>>')
    conn.send(bytes(info,encoding='utf-8'))
conn.close()   #挂电话
sk.close()    #关手机

client端:

# client端
import socket
sk=socket.socket()    #买手机
sk.connect(('127.0.0.1',8080))  #拨别人的号
while True:
    # sk.send(b'hello')
    # ret=sk.recv()
    # print(ret)
    # sk.send(bytes('中午吃什么?'.encode('utf-8')))
    # ret=sk.recv(1024)
    # print(ret.decode('utf-8'))
    info=input(">>>")
    sk.send(bytes(info,encoding='utf-8'))
    ret=sk.recv(1024).decode('utf-8')
    print(ret)
    if ret=='bye':
        sk.send(b'bye')
        break

sk.close()

三、socket之udp和tcp

TCP-demo:

server端:

#server端
import socket
sk=socket.socket()   #买手机 创建一个socket对象
sk.bind(('127.0.0.1',8080)) #绑定ip和端口,启动服务
sk.listen() #写几就是几个,不写就是不限制

conn,addr=sk.accept()  #获取到一个客户端的连接,已经完成了三次握手
                       # 阻塞
# msg = conn.recv(1024)  # 阻塞
# print(msg.decode('utf-8'))
while True:
    info=input('>>>')
    if info=='bye':
        conn.send(b'bye')  # 发消息
        break
    conn.send(info.encode('utf-8'))    #发消息
    ret=conn.recv(1024).decode('utf-8')
    if ret=='bye':
        break
    print(ret)
conn.close()
sk.close()          #关闭socket对象,如果不关闭,还能继续接收

client端:

# client端
import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8080))
while True:
    msg=input('>>>')
    if msg=='bye':
        sk.send(b'bye')
        break
    sk.send(msg.encode('utf-8'))
    ret=sk.recv(1024).decode('utf-8')
    if ret=='bye':
        break
    print(ret)
sk.close()

UDP-demo:

server端:

# server端
import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8080))

msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.sendto(b'bye',addr)

# udp的server不需要监听和建立连接
# 而是在启动服务后,只能被动的等待客户端发送消息过来
# 客户端发送消息的同时还会 自带地址信息
# 消息回复时,不仅需要发送消息,还需要把对方的地址发送过去

client端:

# client端
import socket
sk=socket.socket(socket.SOCK_DGRAM)
ip_port=('127.0.0.1',8080)
sk.sendto(b'hello',ip_port)
ret,addr=sk.recvfrom(1024)
print(ret.decode('utf-8'))
sk.close()

四、利用udp实现qq聊天功能:

server:

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',8080))
while True:
    msg,addr=sk.recvfrom(1024)
    print(addr)
    print(msg.decode('utf-8'))
    info=input('>>>').encode('utf-8')
    sk.sendto(info,addr)
sk.close()

client1:

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
ip_port=('127.0.0.1',8080)
while True:
    # info=input("tiger哥:").encode('utf-8')
    info = input("tiger哥:")
    info=('\033[34m来自tiger哥的消息 %s\033[0m'%info).encode('utf-8')
    sk.sendto(info,ip_port)
    msg,addr=sk.recvfrom(1024)
    print(msg.decode('utf-8'))

sk.close()

client2:

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
ip_port=('127.0.0.1',8080)
while True:
    # info=input("二哥:").encode('utf-8')
    info = input("二哥:")
    info=('\033[32m来自二哥的消息 %s\033[0m'%info).encode('utf-8')
    sk.sendto(info,ip_port)
    msg,addr=sk.recvfrom(1024)
    print(msg.decode('utf-8'))

sk.close()

五:UDP实现时间转换

server端:

# 需求
    # 写一个时间同步的服务器
    # 服务端接收请求
    # 按照client端发送的时间格式,将服务器时间转换成对应格式
    # 发送给客户端
import socket
import time
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.bind(('127.0.0.1',9000))
while True:
    msg,addr=sk.recvfrom(1024)
    time_format=msg.decode('utf-8')
    time_str=time.strftime(time_format)
    sk.sendto(time_str.encode("utf-8"),addr)
sk.close()

client端:

import socket
sk=socket.socket(type=socket.SOCK_DGRAM)
sk.sendto('%Y-%m-%d %H-%M-%S'.encode('utf-8'),('127.0.0.1',9000))
msg,addr=sk.recvfrom(1024)
print(msg.decode('utf-8'))
sk.close()

参考自https://www.cnblogs.com/Eva-J/p/5045061.html

猜你喜欢

转载自blog.csdn.net/weixin_38383877/article/details/84780033