python中的socket网络编程

目录

一.服务端开发

1.什么是Socket网络编程

2.基于Socket完成服务端程序开发

步骤

演示

 二.客户端开发

步骤

演示


python中的socket网络编程_第1张图片

 

一.服务端开发

1.什么是Socket网络编程

socket(简称套接字)是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要socket。
Socket负责进程之间的网络数据传输,好比数据的搬运工。

python中的socket网络编程_第2张图片

 客户端和服务端

2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端

Socket服务端:等待其它进程的连接、可接受发来的消息、可以回复消息
Socket客户端:主动连接服务端、可以发送消息、可以接收回复

 python中的socket网络编程_第3张图片

2.基于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

python中的socket网络编程_第4张图片

#服务端开发

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()

结果是

python中的socket网络编程_第5张图片

 二.客户端开发

步骤

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()

结果是

python中的socket网络编程_第6张图片

 我们先运行服务端的代码,再运行客户端的代码,这样就可以相互构建连接

python中的socket网络编程_第7张图片

 python中的socket网络编程_第8张图片

 

python中的socket网络编程_第9张图片

你可能感兴趣的:(网络,服务器,socket,客户端和服务端)