潭州课堂25班:Ph201805201 并发 第九课 (课堂笔记)
TCP/IP
1,建立连接(三次握手)
1,客户端发起请求
2,服务器请求回应
3,请求确认,双方建立连接
2,数据传输
3,断开连接(四次挥手)
1,客户端请求断开 连接
2,服务器回应请求
3,服务器向客户端请求断开连接
4,客户端回应请求
套接字:
三种套按字:1,监听套接字;2,客户端套接字;3,对等套接字
服务器
# 服务器 import socket server = socket.socket() # 实例化 # print(server) # 监听套接字 # <socket.socket fd=368, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0> # 唯一 地址家族(域) 套接字 TCP server.bind(('0.0.0.0',9001)) # 绑定ip,和端口, server.listen(5) # 同时服务5个, # print(server) # 监听套接字 # <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('0.0.0.0', 9001)> # server.accept() print(server.accept()) # 对等连接套字,用于传输数据 连接成功时与客户端一至 # (<socket.socket fd=484, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9001), raddr=('127.0.0.1', 57015)>, ('127.0.0.1', 57015))
客户端
# 客户端 import socket cllent = socket.socket() # 实例化 cllent.connect(('127.0.0.1',9001)) # 建立连接 print(cllent) # 客户端 套接字 # <socket.socket fd=360, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, # laddr=('127.0.0.1', 56950), raddr=('127.0.0.1', 9001)> # 本地地址 远程地地址
服务器 a
import socket server = socket.socket() server.bind(('',9000)) server.listen(5) con,addr = server.accept() print(con,addr) # con 是对等连接套接字 # con = <socket.socket fd=324, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9000), raddr=('127.0.0.1', 57162)> # addr 是 连接通信地址, # addr = ('127.0.0.1', 57162)
# 数据发送
con.send(b'hi')
# 接收客户端数据
a = con.recv(1024)
print(a)
print(a.decode())
----》
b'\xe8\x8a\xb1\xe7\x97\xb4'
花痴
客户端 a
import socket cllent = socket.socket() cllent.connect(('127.0.0.1',9000))
# 数据接收
r = cllent.recv(1024)
print(r) # ----》b'hi'
# 向服务器发数据
cllent.send('花痴'.encode())
# 关闭连接
cllent.close()
不能发送空值 ''
#服务器 from socket import * ip_port = ('127.0.0.1',9100) back_log = 5 buf_siz = 1024 # tcp_server = socket(AF_INET,SOCK_DGRAM) tcp_server = socket()
# tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) # 在 linux 中重启如果 ip ,端口会被占用,可添加这行,
tcp_server.bind( ip_port ) # 绑定 ip tcp_server.listen( back_log ) while True: # 外层循环,为了服务多个人(要等待) conn,addr = tcp_server.accept() # 接收 等待 TCP 进来 (阻塞) print('双向连接',conn) print('客户端地址:',addr) while True: # 内层循环,与一个人通信, try: data = conn.recv( buf_siz ) # 接收客户端数据 print('来自客户端的数据:',data.decode('utf-8')) conn.send(data) # 回信息 except Exception: break # conn.close() tcp_server.close()
#客户端
import socket,time
client = socket.socket()
client.connect(('127.0.0.1',9100))
while True:
c = input('--->>')
if not c: continue # 输入空值,重来
client.send(c.encode('utf-8'))
print('客户端已经发送消息')
time.sleep(0.1)
data= client.recv(1024)
print('收到服务器发来的信息:',data.decode())
client.close()
基于 TCP 服务端
1, s = socket() 创建套接字,
2, s.bind() 套接字绑定地址,
3,s.listen() 监听,
4,while True: 为了报备多人的外部循环
5,c = s.accept() 接受客户端连接
6, while True: 通信循环
7, recv,conn 对话,收发
8, c.close() 关闭客户端套接字
9,s.close() 关闭服务器
补充:UDB通信
服务器:
# -*- coding: utf-8 -*- from socket import* udp_server = socket(AF_INET,SOCK_DGRAM) udp_server.bind(('127.0.0.1',8080)) while True: data,addr = udp_server.recvfrom(1024) print(data) # 发送数据要带上客户端IP udp_server.sendto(data, addr)
客户端:
# -*- coding: utf-8 -*- from socket import* udp_cl = socket(AF_INET,SOCK_DGRAM) # udp_cl = socket() while True: ma = input('--->>>') # 服务器 ip udp_cl.sendto(ma.encode('utf8'),('127.0.0.1',8080)) data, addr = udp_cl.recvfrom(1024) print(data.decode('utf8'))