python模块之socket
Posted 哈嘉好啊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python模块之socket相关的知识,希望对你有一定的参考价值。
43、python模块之socket:
Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式
UDP通讯:
Server:
Client:
import socket port=8081 host=\'localhost\' s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.sendto(b\'hello,this is a test info !\',(host,port))
很简单 。下面是TCP方式:
Server:
#-*- coding: utf-8 -*-from socket import * from time import ctime HOST=\'\' PORT=12345 BUFSIZ=1024 ADDR=(HOST, PORT) sock=socket(AF_INET, SOCK_STREAM) sock.bind(ADDR) sock.listen(5) while True: print(\'waiting for connection\') tcpClientSock, addr=sock.accept() print(\'connect from \', addr) while True: try: data=tcpClientSock.recv(BUFSIZ) except: print(e) tcpClientSock.close() break if not data: break s=\'Hi,you send me :[%s] %s\' %(ctime(), data.decode(\'utf8\')) tcpClientSock.send(s.encode(\'utf8\')) print([ctime()], \':\', data.decode(\'utf8\')) tcpClientSock.close() sock.close()
Client:
#-*- coding: utf-8 -*-from socket import * class TcpClient: HOST=\'127.0.0.1\' PORT=12345 BUFSIZ=1024 ADDR=(HOST, PORT) def __init__(self): self.client=socket(AF_INET, SOCK_STREAM) self.client.connect(self.ADDR) while True: data=input(\'>\') if not data: break self.client.send(data.encode(\'utf8\')) data=self.client.recv(self.BUFSIZ) if not data: break print(data.decode(\'utf8\')) if __name__ == \'__main__\': client=TcpClient()
上面的TCP方式有个问题,不能退出,好吧,我们改造一下,使这个程序可以发送quit命令以退出:
Server:
#-*- coding: utf-8 -*-from socket import * from time import ctime from time import localtime import time HOST=\'\' PORT=1122 #设置侦听端口 BUFSIZ=1024 ADDR=(HOST, PORT) sock=socket(AF_INET, SOCK_STREAM) sock.bind(ADDR) sock.listen(5) #设置退出条件 STOP_CHAT=False while not STOP_CHAT: print(\'等待接入,侦听端口:%d\' % (PORT)) tcpClientSock, addr=sock.accept() print(\'接受连接,客户端地址:\',addr) while True: try: data=tcpClientSock.recv(BUFSIZ) except: #print(e) tcpClientSock.close() break if not data: break #python3使用bytes,所以要进行编码 #s=\'%s发送给我的信息是:[%s] %s\' %(addr[0],ctime(), data.decode(\'utf8\')) #对日期进行一下格式化 ISOTIMEFORMAT=\'%Y-%m-%d %X\' stime=time.strftime(ISOTIMEFORMAT, localtime()) s=\'%s发送给我的信息是:%s\' %(addr[0],data.decode(\'utf8\')) tcpClientSock.send(s.encode(\'utf8\')) print([stime], \':\', data.decode(\'utf8\')) #如果输入quit(忽略大小写),则程序退出 STOP_CHAT=(data.decode(\'utf8\').upper()=="QUIT") if STOP_CHAT: break tcpClientSock.close() sock.close()
Client:
#-*- coding: utf-8 -*-from socket import * class TcpClient: #测试,连接本机 HOST=\'127.0.0.1\' #设置侦听端口 PORT=1122 BUFSIZ=1024 ADDR=(HOST, PORT) def __init__(self): self.client=socket(AF_INET, SOCK_STREAM) self.client.connect(self.ADDR) while True: data=input(\'>\') if not data: break #python3传递的是bytes,所以要编码 self.client.send(data.encode(\'utf8\')) print(\'发送信息到%s:%s\' %(self.HOST,data)) if data.upper()=="QUIT": break data=self.client.recv(self.BUFSIZ) if not data: break print(\'从%s收到信息:%s\' %(self.HOST,data.decode(\'utf8\'))) if __name__ == \'__main__\': client=TcpClient()
注:以上代码为Python3。
以上是关于python模块之socket的主要内容,如果未能解决你的问题,请参考以下文章