学习目标:如何基于socket编程,来开发一款C/S架构(C:client客户端 S:server服务端)软件
网络编程:实现计算机与计算机间的通信
通信协议:
TCP:可靠,有状态的,长连接的协议,像打电话一样
UDP:不可靠,无连接,像发短信一样
TCP和UDP属于运输层
创建TCP Scoket: s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socket主要类型:socket.AF_INET 服务器之间网络通信
socket.SOCK_STREAM 流式socket,for TCP
socket函数:服务器socket函数,客户端socket函数和公共socket函数
服务器socket函数:bind(address) 以元组的形势表示地址
listen(backing) 挂起的最大连接数
accept() 接受TCP连接并返回
客户端socket函数:connent(address) 连接到address
connent_ex(address) 动能相同,但返回0
公共socket函数:recv() 接受TCP数据
send() 发送TCP数据
sendall() 完整发送TCP数据
socket应用及使用步骤(下面的案例是线程和socket结合的案例)
先创建服务端流程:
#群聊的客户端 import socket,threading #创建个服务端 server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #邦定IP和端口 server.bind(('192.168.43.30',8000)) #设置最大挂起连接数 5 server.listen(5) print('服务端启动 等待客户端连接。。。。。') #中间转换数据的变量 message='' #创建一把锁 lock=threading.Lock() Cond=threading.Condition(lock=lock) #不停的收 不停的发 def recv_msg(conn,address): while True: msg=conn.recv(1024) global message Cond.acquire() message=str(address)+'>>:'+msg.decode() print('收到',+message) Cond.notify_all() Cond.release() def send_msg(conn,address): while True: Cond.acquire() Cond.wait() Cond.release() conn.sendall(message.encode('utf-8')) print('发送'+message) #为每一个连接者提供收和发的线程 while True: conn,address=server.accept() threading._start_new_thread(recv_msg,(conn,address))#不停的收 threading._start_new_thread(send_msg,(conn,address))#不停的发
再创建客户端流程:
import socket,threading #创建客户端 client=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #建立连接 client.connect(('192.168.43.30',8000)) def recv_msg(): while True: msg=client.recv(1024) print('收到:',msg.encode) threading._start_new_thread(recv_msg,()) #不停的发 while True: msg=input('请数据消息:') client.send(msg.encode('utf-8'))