TCP编程(二)[Python]

版权声明:本文为博主原创文章,未经博主允许不得转载。 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

猜你喜欢

转载自blog.csdn.net/weixin_38371360/article/details/85269190