Python线程式“对讲机”:socket网络编程、线程
先看一下程序的运行效果:
一、什么是socket?
socket
是用于在两个基于TCP/IP
协议的应用程序之间相互复通信。我们平时用的QQ,微信,等社交软件,基本都与socket
编程有关。
上图是我们平时访问浏览器时的流程图,但引入本文的,就是服务器
与客户端
之间的爱情瓜葛,而socket编程这个月老就是实现这俩人的交流。
1、在看这俩人甜蜜时,我们要学习几个概念
本段摘自:【socket笔记】TCP、UDP通信总结
IP地址(InternetProtocolAddress)
:是指互联网协议地址,又译为 网际协议地址。IP地址被用来给Internet上的电脑一个编号。我们可以把“个人电脑”比作“一台电话”,那么“IP地址”就相当于“电话号码”。若计算机1知道计算机2的IP地址,则计算机1就能访问计算机2。端口
:端口使用16bit进行编号,即其范围为: 0-65536。但 0-1024 的端口一般由系统分配给计算机特定的服务接口。协议(Protocol)
:是通信双方进行数据交互的一种约定。协议族
:是多个协议的统称。比如我们的TCP/IP协议族,其不仅仅是TCP协议、IP协议,而是多个协议的集合,其包含IP、TCP、UDP、FTP、SMTP等协议。
2、TCP协议
TCP(Transmission Control Protocol 传输控制协议)
:是一种面向连接的、可靠的、基于字节流的传输层通信协议,数据可以准确发送,数据丢失会重发。
- TCP通信的特点:TCP的三次与四次对话
连接:
客户端:服务器!我来造作了 服务器:客户端!我给你开门 客户端:服务器!谢谢
断开:
客户端:服务器!我要走了 服务器:客户端!我去给你开门 服务器:客户端!门开好了,可以滚了 客户端:服务器!诶,好嘞,你等的
再他们互相叫名的过程中,其实就是一个互相确定传输的过程:
在连接时TCP有如下过程:
在断开时有如下过程:
3、UDP协议
UDP(User Datagram Protocol, 用户数据报协议)
:是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,可以保证通讯效率,传输延时小。例如视频聊天应用中用的就是UDP协议,这样可以保证及时丢失少量数据,视频的显示也不受很大影响。
二、socket编程
1、服务器端
- 将接受功能单独放入一个线程,让此线程单独运作,不让他阻塞发送。
- 代码:
import socket
import threading
import sys
def server_lunch():
HostPort = ('127.0.0.1', 9999)#设定主机名,端口
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#参数
s.bind(HostPort)#绑定IP接口
s.listen(20)#开始监听
conn, addr = s.accept()#开始握手
print('Connecting by : ', addr)#显示链接的administered
welcome = "···weclome to -LEAGUES OF SOPHON-···"
conn.send(welcome.encode('utf8'))#至上欢迎辞
return conn
def receive(conn):#接收函数
while True:
msg = conn.recv(1024).decode('utf8')#接收信息流,并转化编码
print("clience says:",msg)
if msg == "exit":
sys.exit()#退出程序
if __name__ == '__main__':
conn = server_lunch()#启动服务端
server_trd = threading.Thread(target=receive , args=(conn,))#开启线程
server_trd.start()
while True:#循环输入
root = input(">>>").strip()
conn.send(root.encode('utf8'))
if root == "exit":
s.close()
2、同理的客服端
import socket
import threading
import sys
def receive(s):#接收函数
while True:
msg = s.recv(1024).decode('utf8')
if msg == "exit":
sys.exit()
print ("server says:", msg)
if __name__ == '__main__':
hostport = ('127.0.0.1', 9999)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(hostport)#连接接口
print(s.recv(1024).decode())
clience_trd = threading.Thread(target=receive,args=(s,))#启动接收线程
clience_trd.start()
while True:
user_input = input('>>> ').strip()
s.send(user_input.encode('utf-8'))
if user_input == 'quit':
sys.exit()
运行结果:
实在是有趣。
推荐大家阅读一下这两篇文章。Python 网络编程入门——用 Socket 做一个风花雪月服务器,Python 进阶必备:线程模块 threading
往后可能去开发一个原始版的QQ,以作为网络编程学习的大作业,亲情期待。