主要使用的模块是socket模块,在这个模块中可以找到socket()函数,该函数用于创建套接字对象。套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。
构造函数:
socket.socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)
family: 套接字地址家族,Python支持 AF_INET (默认),AF_INET6, AF_UNIX, AF_CAN 和 AF_RDS
type:套接字类型,SOCK_STREAM (默认), SOCK_DGRAM, SOCK_RAW
proto:协议编号(默认为0)
TCP服务器及客户端代码
1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 import socket 4 import threading 5 from time import asctime 6 from multiprocessing import Lock 7 8 9 lock = Lock() 10 11 12 def tcplink(sock, addr): 13 print('. . . connecting from %s:%s ' % addr) 14 sock.send(b'Welcome !') 15 while True: 16 # 接收数据 17 data = sock.recv(1024) 18 if not data or data.decode('utf-8') == 'exit': 19 break 20 # 通过在客户端中输入口令和密码来关闭服务器 21 elif data.decode('utf-8') == 'close the server!': 22 global server 23 24 passwd = sock.recv(1024) 25 if passwd.decode('utf-8') == '1111': 26 with lock: 27 server.close() 28 29 return # 跳出函数tcplink,则子进程也执行完毕 30 else: 31 # 发送数据 32 sock.send(('%s %s' % (asctime(), data.decode())).encode()) 33 # 客户端已关闭,关闭该临时套接字 34 sock.close() 35 print('Connection from %s:%s close . . .' % addr) 36 37 38 ip_port = ('127.0.0.1', 5110) 39 # 创建基于IPv4和TCP协议的socket 40 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 41 # 绑定端口 42 server.bind(ip_port) 43 # 监听端口 44 server.listen(5) 45 print('Server is open\n*********************************') 46 47 while True: 48 try: 49 print('Waiting for new connection . . . ') 50 # 接受一个新链接 51 # sock为临时套接字,用于客户端与服务器的数据交互 52 sock, addr = server.accept() # 当服务器被子进程中关闭会有OSError 53 # 创建新线程来处理TCP连接 54 t = threading.Thread(target=tcplink, args=(sock, addr)) 55 t.start() 56 except OSError: 57 print('*********************************\nServer is closed') 58 exit() TCP服务器 1 #!/usr/bin/python 2 # -*- coding:utf-8 -*- 3 import socket 4 5 6 ip_port = ('127.0.0.1', 5110) 7 # 创建基于IPv4和TCP协议的socket 8 client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9 # 建立连接 10 client.connect(ip_port) 11 print(client.recv(1024).decode()) 12 13 while True: 14 data = input('Please enter data: ') 15 # 发送数据 16 client.send(data.encode()) 17 if not data or data == 'exit': 18 break 19 # 监听到输入为关闭服务器的特殊口令时: 20 elif data == 'close the server!': 21 passwd = input('Password: ') 22 client.send(passwd.encode()) 23 print(client.recv(1024).decode()) 24 client.close() TCP客户端UDP服务器及客户端代码
#!/usr/bin/python # -*- coding:utf-8 -*- import socket from time import asctime ip_port = ('127.0.0.1', 5002) server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server.bind(ip_port) print('Server is opening . . . ') while True: print(' . . . Waiting for new connection') data, addr = server.recvfrom(1024) if data == b'close the server!': print('get close') passwd = server.recv(1024) if passwd == b'1111': server.sendto(b'Server is closed !', addr) break elif not data or data == b'exit': pass else: print('Received from %s:%s . . . ' % addr) server.sendto(b'%s <--> %s' % (asctime().encode(), data), addr) server.close() UDP服务器 #!/usr/bin/python # -*- coding:utf-8 -*- import socket ip_port = ('127.0.0.1', 5002) client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) while True: data = input('Please input: ') if not data or data == 'exit': break elif data == 'close the server!': client.sendto(data.encode(), ip_port) passwd = input('Password: ') client.sendto(passwd.encode(), ip_port) else: client.sendto(data.encode(), ip_port) response = client.recv(1024).decode() print(response) client.close() UDP客户端
参考和引用:
http://yangrong.blog.51cto.com/6945369/1339593/
http://www.cnblogs.com/aylin/p/5572104.html
https://docs.python.org/3/library/socket.html
转载于:https://www.cnblogs.com/thunderLL/p/6435762.html
相关资源:数据结构—成绩单生成器