网络编程:实现计算机与计算机间的通信
通过网络编程我们要了解什么问题?通信协议:
tcp:可靠,有状态的,长连接的协议,像打电话一样
udp:不可靠,无连接,像发短信一样。发送的包的顺序要有编号
http:基于tcp的协议,
ftp:文件传输协议
pop3:邮局协议版本3”。是TCP/IP协议族中的一员
smtp:简单邮件传输协议
示例:服务端代码
# Socket 通信 先创建个服务端 import socket # 创建个服务端 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 1:绑定 ip和端口 server.bind(('192.168.137.1', 8000)) # 1.5:设置最大挂起数 5 server.listen(5) print('服务端 启动等待客户端连接......') # 2:等待客户端连接,如果有链接,将返回一个 连接对象对方的地址 conn, address = server.accept() # 3:接受客户端发过来,多大字节的数据 while True: msg = conn.recv(1024) print('客户端发来:', msg.decode()) # 把接受到的 bytes 转出回去 # 4:给客户端 回复 数据 conn.sendall(input('服务端:').encode('utf-8')) # 以utf-8的字符集去转成bytes # 结束了 连接关闭 服务关闭 conn.close() server.close()
客户端代码:
import socket # 1:创建 客户端 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2:建立连接 client.connect(('192.168.137.1', 8000)) # 3:发消息 格式:bytes 以utf-8的字符集转成bytes print('---输入 n 结束对话---') while True: msg = input('客户端:') if msg.__eq__('n'):break client.send(msg.encode('utf-8')) # 4:等待回复 并读取回复 msg = client.recv(1024) print('服务器回复:', msg.decode()) # 关闭连接 client.close()
群聊示例:
群聊服务端:
# Socket 通信 先创建个服务端 import socket, threading # 创建个服务端 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 1:绑定 ip和端口 server.bind(('192.168.137.1', 8000)) # 1.5:设置最大挂起数 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((conn, address)) # 不停地收 threading._start_new_thread((conn, address)) # 不停地发
群聊客户端:
import socket,threading # 1:创建 客户端 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 2:建立连接 client.connect(('192.168.137.1', 8000)) # 收取其他用户的数据 def recv_msg(): while True: msg = client.recv(1024) print('收到:', msg.decode()) threading._start_new_thread(recv_msg,()) # 不停地发 while True: msg = input('请输入数据信息:') client.send(msg.encode('utf-8'))