python 简单TCP服务器(时间戳)/客户端 支持IPv4/IPv6

例子来自于Python文档18.1.5

服务器程序,在客户端发过来的消息前加上当前的时间戳,并发送回客户端。
from socket import *
from time import ctime
import sys


HOST = None			# Symbolic name meaning all available interfaces
PORT = 21560
BUFSIZ = 1024
s = None

# 根据给定的参数host/port,相应的转换成一个包含用于创建socket对象的五元组
# AF_UNSPEC: IPv4 IPv6
for res in getaddrinfo(HOST, PORT, AF_UNSPEC, 
				SOCK_STREAM, 0, AI_PASSIVE):
#	print(res)
	af, socktype, proto, canonname, sockaddr = res

	try:
		s = socket(af, socktype, proto)	# create a socket object
	except OSError as msg:
		s = None
		continue

	try:
		s.bind(sockaddr)
		s.listen(5)
	except OSError as msg:
		s.close()
		s = None
		continue
	break

if s is None:
	print('cound not open socket')
	sys.exit(1)

while True:
	print('waiting for connection...')
	client, addr = s.accept()
	
	with client:
		try:
			print('\n', '-' * 60)
			print('connect from: ', addr)
			while True:
				data = client.recv(1024)
				if not data:
					break
				print('recv: ', data.decode())
				client.send(ctime().encode() + b' ' + data)
		except ConnectionResetError as msg:
			print(msg)
			continue
	
	'''
	try:
		with client:
			print('\n', '-' * 60)
			print('connect from: ', addr)
			while True:
				data = client.recv(1024)
				if not data:
					break
				print('recv: ', data.decode())
				client.send(ctime().encode() + b' ' + data)
	except ConnectionResetError as msg:
		print(msg)
		continue
	'''

客户端程序
from socket import *
import sys


HOST = gethostname()	# the localhost
PORT = 21560
BUFSIZ = 1024
c = None

for res in getaddrinfo(HOST, PORT, AF_UNSPEC, SOCK_STREAM):
#	print(res)
	af, socktype, proto, canoname, sockaddr = res

	try:
		c = socket(af, socktype, proto)
	except OSError as msg:
		c = None
		continue

	try:
		c.connect(sockaddr)
	except OSError as msg:
		c.close()
		c = None
		continue
	break

if c is None:
	print('cound not open socket')
	sys.exit(1)

with c:
	while True:
		data = input('> ')
		# when input nothing, break while
		if not data:
			break
		c.sendall(data.encode())
		data = c.recv(BUFSIZ)
		if not data:
			print('recv error!')
			break
	
		print('recv:', data.decode())


猜你喜欢

转载自blog.csdn.net/hugh___/article/details/80640146
今日推荐