目录
一.服务端开发
1.什么是Socket网络编程
2.基于Socket完成服务端程序开发
步骤
演示
二.客户端开发
步骤
演示
socket(简称套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要socket。
Socket负责进程之间的网络数据传输,好比数据的搬运工。
客户端和服务端
2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端
Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息
Socket客户端:主动连接服务端、可以发送消息、可以接收回复
1.创建socket对象
import socket
#创建socket对象
socket_server=socket.socket()
2.绑定socket_server到制定IP和地址
#socket_server.bind((host,port))
#绑定IP地址和端口
socket_server.bind(("localhost",8888))
3.服务端开始监听端口
#socket_server.linsen(backlog)
#backlog为int整数,表示允许的连接数量,超出的会等待,可以不填,不填会自动设置一个合理值
#监听端口
socket_server.listen(1)
#listen方法内接受一个整数型参数,表示接受的链接数量
4.接收客户端连接,获得连接对象
#等待客户端连接
# result:tuple=socket_server.accept()
# conn=result[0] #客户端和服务器的连接对象
# address=result[1] #客户端的地址信息
conn,address=socket_server.accept()
#accept方法返回的是二元元组(连接对象,客户端地址信息)
#可以通过变量1,变量2=socket_server.accept()的形式直接接收二元元组内的两个元素
#accept方法,是阻塞方法,等待客户端的连接,就卡在这一行不向下执行了
5.客户端连接后,通过recv方法,接收客户端发送的消息
while True:
#接受客户端信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
data=conn.recv(1024).decode("utf-8")
#recv接受的参数是缓存区大小,一般给1024即可,同样也是阻塞方法
#recv方法的返回值是一个字节数组也就是byte对象,不是字符串,可以通过decode方法通过uft-8编码,将字节数组转换为字符串对象
print(f"客户端发来的信息是{data}")
6.通过conn(客户端当次连接对象),调用send方法可以回复信息
while True:
#接受客户端信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
data=conn.recv(1024).decode("utf-8")
#recv接受的参数是缓存区大小,一般给1024即可,同样也是阻塞方法
#recv方法的返回值是一个字节数组也就是byte对象,不是字符串,可以通过decode方法通过uft-8编码,将字节数组转换为字符串对象
print(f"客户端发来的信息是{data}")
#发送回复信息
msg=input("请输入你要和客户端回复的信息:")
if msg=="exit":
break
conn.send(msg.encode("utf-8"))
7.conn(客户端当次连接对象)和socket_server对象调用close方法,关闭连接
#关闭连接
conn.close()
socket_server.close()
下载网络调试助手作为客户端
https://github.com/nicedayzhu/netAssist/releases
#服务端开发
import socket
#创建socket对象
socket_server=socket.socket()
#绑定IP地址和端口
socket_server.bind(("localhost",8888))
#监听端口
socket_server.listen(1)
#listen方法内接受一个整数型参数,表示接受的链接数量
#等待客户端连接
# result:tuple=socket_server.accept()
# conn=result[0] #客户端和服务器的连接对象
# address=result[1] #客户端的地址信息
conn,address=socket_server.accept()
#accept方法返回的是二元元组(连接对象,客户端地址信息)
#可以通过变量1,变量2=socket_server.accept()的形式直接接收二元元组内的两个元素
#accept方法,是阻塞方法,等待客户端的连接,就卡在这一行不向下执行了
print(f"接收到了客户端的连接,客户端的信息是{address}")
while True:
#接受客户端信息,要使用客户端和服务端的本次连接对象,而非socket_server对象
data=conn.recv(1024).decode("utf-8")
#recv接受的参数是缓存区大小,一般给1024即可,同样也是阻塞方法
#recv方法的返回值是一个字节数组也就是byte对象,不是字符串,可以通过decode方法通过uft-8编码,将字节数组转换为字符串对象
print(f"客户端发来的信息是{data}")
#发送回复信息
msg=input("请输入你要和客户端回复的信息:")
if msg=="exit":
break
conn.send(msg.encode("utf-8"))
#关闭连接
conn.close()
socket_server.close()
结果是
1.创建socket对象
#客户端开发
import socket
#创建socket对象
socket_client=socket.socket()
2.连接到服务端
#连接到服务端
socket_client.connect(("localhost",8888))
3.发送信息
while True:
#发送信息
msg=input("要给服务端发送的信息是:")
if msg=="exit":
break
socket_client.send(msg.encode("utf-8"))
4.接收返回信息
while True:
#发送信息
msg=input("要给服务端发送的信息是:")
if msg=="exit":
break
socket_client.send(msg.encode("utf-8"))
#接收返回的信息
recv_data=socket_client.recv(1024)#1024是缓存区大小,一般1024即可,同样recv方法是阻塞的
print(f"服务端回复的信息是{recv_data.decode('utf-8')}")
5.关闭连接
#关闭连接
socket_client.close()
#客户端开发
import socket
#创建socket对象
socket_client=socket.socket()
#连接到服务端
socket_client.connect(("localhost",8888))
while True:
#发送信息
msg=input("要给服务端发送的信息是:")
if msg=="exit":
break
socket_client.send(msg.encode("utf-8"))
#接收返回的信息
recv_data=socket_client.recv(1024)#1024是缓存区大小,一般1024即可,同样recv方法是阻塞的
print(f"服务端回复的信息是{recv_data.decode('utf-8')}")
#关闭连接
socket_client.close()
结果是
我们先运行服务端的代码,再运行客户端的代码,这样就可以相互构建连接