python中的socket网络编程

目录

一.服务端开发

1.什么是Socket网络编程

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

步骤

演示

 二.客户端开发

步骤

演示


 

一.服务端开发

1.什么是Socket网络编程

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

 客户端和服务端

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

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

 

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

#服务端开发

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

结果是

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

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳862

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值