Python Socket学习

来源:互联网 发布:logback 不打印sql 编辑:程序博客网 时间:2024/06/06 19:48

Python Socket学习

Python在网络通讯方面功能强大,学习一下Socket通讯的基本方式

UDP通讯:

Server:

复制代码
import socketport=8081s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)#从指定的端口,从任何发送者,接收UDP数据s.bind(('',port))print('正在等待接入...')while True:    #接收一个数据    data,addr=s.recvfrom(1024)    print('Received:',data,'from',addr)
复制代码

Client:

import socketport=8081host='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 ctimeHOST=''PORT=12345BUFSIZ=1024ADDR=(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 ctimefrom time import localtimeimport timeHOST=''PORT=1122  #设置侦听端口BUFSIZ=1024ADDR=(HOST, PORT)sock=socket(AF_INET, SOCK_STREAM)sock.bind(ADDR)sock.listen(5)#设置退出条件STOP_CHAT=Falsewhile 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:            breaktcpClientSock.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。

0 0
原创粉丝点击