一、将数据写在发送语句中【传统方式】
server端代码
import socket #服务器端将socket套接字赋给sock套接字 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #服务器端调用sock.setsockopt为这个socket对象设置值,包括(level,optname,value) sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #服务器调用sock.bind为这个socket对象绑定到一个地址上,它需要一个主机地址和端口组成的元组作为参数 sock.bind(('127.0.0.1',8000)) #服务器用sock.listen为这个socket开始TCP监听,参数可以为挂起的最大连接数量,该值至少为1,大部分程序设为5就可以 sock.listen(5) #进行无限循环 while 1: #sock.accept被动接受TCP客户端的连接,等待连接的到来。 cli_sock,cli_addr=sock.accept() #sock.recv()接受TCP数据,将cli_sock套接字接受的数据传递给rep嵌套字 req=cli_sock.recv(4096) #cli_sock发送TCP数据,将string的数据发送到连接的套接字,返回值是要发送的字节数量 cli_sock.send(b'hello world') #关闭套接字 cli_sock.close()
client端代码:
import socket #客户端将socket套接字赋给sock套接字 sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #客户端调用sock.connect主动初始化服务器连接,参数为(hostname,port) sock.connect(('127.0.0.1',8000)) #客户端调用sock.send向服务器发送数据 sock.send(b"GET/HTTP/1.1\r\nHost:127.0.0.1:8080\r\n\r\n") #客户端使用套接字data代替sock.recv接受的数据值 data=sock.recv(4096) #打印出来data print(data) #关闭套接字 sock.close()
运行演示:
首先运行启动服务器,再运行启动客户端,然后客户端与服务器建立连接,向服务器发送数据,然后接受服务器发送过来的字符数据b’hello world’。
二、将服务器和客户端封装起来【优化方式】
server端代码:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8081)) phone.listen(5) print('starting...') while True:#链接循环 conn,client_addr=phone.accept() print(client_addr) while True:#通信循环 try: data=conn.recv(1024) #单位:bytes; # 1024代表最大接受1024个bytes print("客户端的数据:",data) conn.send(data.upper()) except ConnectionError: break conn.close() phone.close()
client端代码:
import socket phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8081)) while True: msg=input('>>').strip() if not msg:continue phone.send(msg.encode('utf-8')) data=phone.recv(1024) print(data.decode("utf-8")) phone.close()
运行演示:
先启动服务器,服务器输出“starting…” ,然后启动客户端,与服务器建立连接,然后在客户端可以输入消息,回车发送给客户端,客户端接收并显示出消息。