Python socket网络编程TCP/IP服务器与客户端通信
Pythonsocket网络编程
初学python,前段时间买了两本书《python编程从入门到实践》《Python核心编程第三版》,第一本书主要讲的是一些基本语法和一些基本的使用方法,而第二本则深入很多,自己看来也是一知半解,刚好看到了这部分网络编程,依然有好多不太理解的地方,不过想来通过自己不断的摸索,不断地搜寻资料学习,早晚应该会变得通透吧.......
这部分主要使用的模块就是socket模块,在这个模块中可以找到socket()函数,该函数用于创建套接字对象,套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。
socket()模块函数
要创建套接字,必须使用socket.socket()函数,他一般的语法如下
socket(socket_family,socket_type,protocol=0)
其中socket_family是AF_UNIX或AF_INET,socket_type是SOCK_STREAM或SOCK_DGRAM,protocol通常省略,默认=0.
所以创建TCP/IP套接字,可以使用下面的方式调用socket.socket().
tcpSock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
同样创建UDP/IP套接字,使用下面的方法调用
udpSock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
创建TCP服务器
创建TCP服务器的流程基本如下,并非正真正的代码
ss=socket()#创建服务器套接字 ss.bind()#套接字与地址绑定 ss.listen()#监听连接 inf_loop:#服务器无限循环 cs=ss.accepr()#接受客户端连接 comm_loop:#通信循环 cs.recv()/cs.send()#对话(接收/发送) cs.close()#关闭客户端套接字 ss.close()#关闭服务器套接字(可选)
实际中创建TCP服务器基本流程就如上边所说,可能稍有不同但基本思路应该是相通的,下边是真正穿件服务器的代码:
#!/usr/bin/envpython #-*-coding:utf-8-*- fromsocketimport*#将socket属性引入到命名空间 HOST=''#这是对bind()方法的标识表示可以使用任何可用的地址 PORT=21571#端口号 BUFSIZ=1024#缓冲区大小,1kb ADDR=(HOST,PORT)#地址???? tcpSerSocket=socket(AF_INET,SOCK_STREAM)#创建tcp套接字 tcpSerSocket.bind(ADDR)#将地址绑定到套接字上 tcpSerSocket.listen(5)#设置并启动套接字监听 whileTrue:#无限循环,等待客户端连接 print('waitingforconnection...') tcpCliSocket,addr=tcpSerSocket.accept()#被动接受客户端连接 print('...connectedfrom:',addr) whileTrue:#对话循环,等待客户端发送消息 data=tcpCliSocket.recv(BUFSIZ)#接收客户端消息 ifnotdata:#如果消息是空白,跳出对话循环,关闭当前连接 break tcpCliSocket.send(data)#如果收到消息,将消息原封不动返回客户端 tcpCliSocket.close() tcpSerSocket.close()
创建TCP客户端
同上边一样,一个简单的非代码流程
cs=socket()#创建客户端套接字 cs.connect()#尝试连接服务器 comm_loop:#通信循环 cs.send()/cs.recv()#对话(发送/接收) cs.close()#关闭客户端套接字
实际中创建客户端也是翻译上边的步骤
#!/usr/bin/envpython #-*-coding:utf-8-*- fromsocketimport* HOST='localhost'#服务器的主机名 PORT=21571#端口号 BUFSIZ=1024#缓冲区 ADDR=(HOST,PORT)#地址 tcpCliSocket=socket(AF_INET,SOCK_STREAM)#创建客户端套接字 tcpCliSocket.connect(ADDR)#连接服务器 whileTrue:#通信循环 data=input('>')#客户端输入信息 ifnotdata:#如果输入信息为空,则跳出循环,关闭通信 break data=str.encode(data) tcpCliSocket.send(data)#发送客户端信息 data=tcpCliSocket.recv(BUFSIZ)#接受服务器返回信息 ifnotdata:#如果服务器未返回信息,关闭通信循环 break print('get:',data.decode('utf-8')) tcpCliSocket.close()
当然,这只是最基础的通信,而且关于主机名,端口号之类的东西暂时还不是很懂,目前所做的只是在同一台电脑上通信,端口号也需要一致,如果不同的电脑进行通信该怎么做?我还只是个小白.....
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!