套接字(socket)初使用 / 基于TCP协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
server端
import socket import time sk = socket.socket() sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 ''' 127.0.0.1是回送地址,指本地机,一般用来测试使用。 回送地址是本机回送地址(Loopback Address), 即主机IP堆栈内部的IP地址,主要用于网络软件测试以及本地机进程间通信, 无论什么程序,一旦使用回送地址发送数据,协议软件立即返回,不进行任何网络传输。 ''' ''' sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'this message from server') conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选) ''' sk.listen() conn,addr = sk.accept() while 1: ret1 = conn.recv(1024) ret1 = ret1.decode('utf-8') print(ret1) if 'q' in ret1: break usr = input(">>>") conn.send(bytes('来自客户端\n发送时间%s\n%s'%(time.asctime(time.localtime(time.time())),usr),encoding='utf-8')) if usr == 'q': break conn.close() sk.close()
client端
import socket import time sk = socket.socket() sk.connect(('127.0.0.1',8898)) ''' import socket sk = socket.socket() # 创建客户套接字 sk.connect(('127.0.0.1',8898)) # 尝试连接服务器 sk.send(b'hello!') ret = sk.recv(1024) # 对话(发送/接收) print(ret) sk.close() # 关闭客户套接字 ''' while 1: usr1 = input('>>>') sk.send(bytes('来自客户端\n发送时间%s\n%s'%(time.asctime(time.localtime(time.time())),usr1),encoding='utf-8')) if usr1 == 'q': break ret2 = sk.recv(1024) ret2 = ret2.decode('utf-8') print(ret2) if 'q' in ret2: break sk.close()
问题:有的同学在重启服务端时可能会遇到

解决方法:
#加入一条socket配置,重用ip和端口 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加 sk.bind(('127.0.0.1',8898)) #把地址绑定到套接字 sk.listen() #监听链接 conn,addr = sk.accept() #接受客户端链接 ret = conn.recv(1024) #接收客户端信息 print(ret) #打印客户端信息 conn.send(b'hi') #向客户端发送信息 conn.close() #关闭客户端套接字 sk.close() #关闭服务器套接字(可选)
浙公网安备 33010602011771号