网络编程分为服务端编程和客户端编程:
服务端编程:
- 创建socket对象(可以先定义好ip、端口号 ,并组成一个adress元组)
- 绑定服务端ip包
- 开始监听,将在指定的ip端口上监听,listen()方法
- 接收客户端接入请求socket.accept()
- 接收客户端信息 recv()
- 向客户端发送消息 send()
- 关闭socket(套接字)
1、创建socket对象(可以先定义好ip、端口号 ,并组成一个adress元组)
host = "127.0.0.1" #本机ip
port = 8880 #端口
address = (host, port) #ip包
#创建socket
soc_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("建立socket")
函数 socket.socket 创建一个socket,返回socket的描述符赋值给soc_server,将在后面函数中使用。该函数带有两个参数:(Adress,type)
Address:这里用的是AF_INET其含义是 ipv4
type:用的是SOCK_STREAM(流式套接字,主要用于TCP协议)
2、绑定服务端ip包
#绑定服务端ip包
soc_server.bind(address)
print("成功绑定IP包")
用bind()方法,将定义好的由ip和端口号组成的元组作为参数传进去,从而绑定特定的ip和端口
3、开始监听,将在指定的ip端口上监听,listen()方法
#监听连接
soc_server.listen(1)
print("启动监听,等待接入.....")
该listen函数带有一个参数称为backlog,用来控制连接的个数。这里设的是1,如果设为10,那么就有10个连接正在等待处理,此时如果有11个请求过来时将会被拒绝
4、接收客户端接入请求socket.accept()
while 1:
#接收客户端接入请求
soc_client, addr=soc_server.accept()
print("成功接收{}:{}".format(addr[0],addr[1]))
进入死循环一直等待客户端的请求。这时不要关闭这个程序,让他运行,现在可以去运行客户端程序,让客户端通过端口连接到socket
5、接收客户端信息 recv()、向客户端发送消息 send()
while 1:
#接收客户端发来的消息
data_recv = soc_client.recv(1024).decode("utf-8") #每次接收数据长度必须是1024的整数倍
print("{}:{}说:{}".format(addr[0],addr[1],data_recv))
#向客户端发送消息
soc_client.send("服务端成功接收数据".encode("utf-8"))
连接成功后如果一直没有数据过来会一直阻塞这里,指导客户端发送数据过来程序继续运行。recv()方法中的参数是指数据长度,并且必须为1024的整数倍。在客户端与服务端上的数据交流都是以字节流的方式传输信息,所以必须用decode解码把字节流转换成字符串和encode编码把字符串转成字节流。详见:python字节和字符串互转_愤怒的苹果ext的博客-CSDN博客_python 字节转字符
6、关闭套接字
# 关闭客户端套接字
soc_client.close()
#关闭服务端套接字
soc_server.close()
服务端具体代码:
import socket
host = "127.0.0.1" #本机ip
port = 8880 #端口
address = (host, port) #ip包
try:
#创建socket
soc_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("建立socket")
#绑定服务端ip包
soc_server.bind(address)
print("成功绑定IP包")
#监听连接
soc_server.listen(1)
print("启动监听,等待接入.....")
while 1:
#接收客户端接入请求
soc_client, addr=soc_server.accept()
print("成功接收{}:{}".format(addr[0],addr[1]))
while 1:
#接收客户端发来的消息
data_recv = soc_client.recv(1024).decode("utf-8") #每次接收数据长度必须是1024的整数倍
print("{}:{}说:{}".format(addr[0],addr[1],data_recv))
#向客户端发送消息
soc_client.send("服务端成功接收数据".encode("utf-8"))
# 关闭客户端套接字
soc_client.close()
soc_server.close()
except Exception as ex:
print(ex)
客户端编程见下一篇:网络编程(TCP编程)的总结(python)----客户端篇_QY&ZY的博客-CSDN博客
ps:个人学习笔记,如有错误请大神指出