版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_38371360/article/details/85269190
前言
转眼间都2019年了,首先祝大家新年快乐,也希望自己能够坚持下去。希望自己有所为,有所爱,有所希望,有所热爱。
《TCP编程(一)[Python]》中已经基本描述了Python中如何建立一个socket通信的基本架构。本章首先给出本机通信Client端和Server端的完整代码,再学习一下多线程,做做笔记。
正文
客户端代码
import socket
HostPort = ('127.0.0.1', 9995)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(HostPort)
while True:
Input_Message = input('>>> ').strip()
s.send(Input_Message.encode('utf-8'))
if len(Input_Message) == 0:
continue
if Input_Message in ('Quit','quit'):
s.close()
break
server_reply = s.recv(1024).decode() +" " +'From ' + HostPort[0]
print(server_reply)
服务端代码
import socket
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9995)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
conn,addr = s.accept()
while True:
data = conn.recv(1024).decode()+" "+'From '+HostPort[0]
print (data)
user_input = input('>>>')
conn.send(user_input.encode('utf8'))
多线程Socket
上述的连接只是简单单一线程的socket连接,意思就是只能一收一发,一次只能发送一条消息,必须等待对方回复后才能发送下一条消息,因此可以使用多线程来为每一次的通信开一个线程,完成多发多收的效果。
客户端代码
import socket
import threading
HostPort = ('127.0.0.1', 9994)
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(HostPort)
Switch = True
def Receive(s):
global Switch
while Switch:
data = s.recv(1024).decode('utf8')
if data == 'quit':
Switch = False
print('Received Message:',data)
'''
创建一个新线程:其中
target = Receive 为线程函数
args[,kwargs]表示传递给线程函数的参数,必须是一个tuple类型
'''
thread = threading.Thread(target=Receive, args=(s,))
thread.start()
while Switch:
Input_Message = input('>>>')
s.send(Input_Message.encode('utf8'))
if Input_Message in('quit','Quit'):
Switch = False
s.close()
服务器端代码
#导入socket、threading多线程模块
import socket
import threading
print("Waitting to be connected......")
HostPort = ('127.0.0.1',9994)
#创建一个socket连接
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(HostPort)
s.listen(1)
socket, address = s.accept()
Switch=True
address = str(address)
print('Connecting by : %s ' % address)
#定义一个接收数据的函数
def Receive(socket):
#此处定义一个全局变量Switch
global Switch
while Switch:
data = socket.recv(1024).decode('utf8')
if data == 'quit':
true=False
print("Received Message: " + data +" from" + address)
#实例化一个线程
thread=threading.Thread(target=Receive, args=(socket,))
thread.start()
while Switch:
Input_Message = input('>>>')
socket.send(Input_Message.encode('utf8'))
if Input_Message == 'quit':
Switch = False
s.close()
未完待续……
参考链接
https://blog.csdn.net/dyy8686/article/details/79356189#commentsedit