0条评论
还没有人评论过~
###1.概述
socket套接字编程遵循客户-服务端架构;
python中的socket模块,是对套接字编程的实现,主要支持tcp、udp;
###2.socket模块函数注解
创建套件字:
服务器端套接字方法:
客户端套接字方法:
共用套接字方法:
阻塞式套接字方法:
面向文件的套接字的方法
更多详情参见socket模块的api文档
###3. 举例 服务端demo:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Echo server program
import socket
import sys
HOST = None # Symbolic name meaning all available interfaces
PORT = 8888 # Arbitrary non-privileged port
def bind(host, port):
s = None
if host == "":
host = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
family, socktype, proto, canonname, sockaddr = res
print (family, socktype, proto, canonname, sockaddr)
try:
s = socket.socket(family, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.bind(sockaddr)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# s.setblocking(0)
s.listen(128)
except socket.error, e:
print e
s.close()
s = None
continue
break
return s
def main():
s = bind("", PORT)
if s is None:
print 'could not open socket'
sys.exit(1)
while 1:
conn, addr = s.accept()
print u"客户端socket: %s" % conn
print u"客户端socket地址: %s" % repr(addr)
print u"客户端socket远端地址: %s" % repr(conn.getpeername())
print u"客户端socket本端地址:%s" % repr(conn.getsockname())
data = conn.recv(1024)
if not data:
break
print u'收到的data: %s\n\n' % data
conn.send(data)
conn.close()
if __name__ == '__main__':
main()
客户端demo:
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Echo client program
import socket
import sys
HOST = None # The remote host
PORT = 8888 # The same port as used by the server
def main():
s = None
for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
family, socktype, proto, canonname, sockaddr = res
try:
s = socket.socket(family, socktype, proto)
except socket.error as msg:
s = None
continue
try:
s.connect(sockaddr)
except socket.error as msg:
s.close()
s = None
continue
break
if s is None:
print 'could not open socket'
sys.exit(1)
print u"客户端socket远端地址: %s" % repr(s.getpeername())
print u"客户端socket本端地址:%s" % repr(s.getsockname())
s.sendall('Hello, world')
data = s.recv(1024)
s.close()
print u'从服务端接收到的data %s' % repr(data)
if __name__ == '__main__':
main()
###4.注意事项
来源:oschina
链接:https://my.oschina.net/u/1037577/blog/168658