1.简单了解socket
通过计算机操作系统的知识我们知道进程与进程之间是相互隔离的,所以为了让进程之间可以通信,提供了几种进程通信的方式:1.信号;2.信号量;3.socket;4.共享内存;5.消息队列;6.pipe(管道)。这些方式在不同的场景和需求下有各自的特点和适用性。其中socket(套接字)是一种在计算机网络中实现的进程间通信的方式。它允许不同计算机上的进程之间通过网络进行数据交换和通信。又因为它是通过网络的,所以它不仅可以实现在同一计算机内的进程间通信,也可以实现在不同计算机之间的进程间通信。
2.通过python实现
python中有一个socket模块,这个模块提供了一些函数可以实现socket网络编程。首先,我们先熟悉一下面socket网络编程需要用到的函数:
1.socket() 用于创建一个socket(套接字)对象,即 变量名 = socket.socket()。
2.bind() 用于将套接字绑定到特定的地址和端口,同时,这个函数需要使用元组来传递需要绑定的地址和端口;通常第一个是ip地址,第二个是端口。
3.listen() 用于监听连接的请求;listen(10),参数10是指允许最大的未决连接数,即排队队列客户端数。注意:C/S需要在同一个端口。
4.accept() 用于接受连接并建立与客户端通信的套接字。使用 accept()接受连接请求并返回一个新的套接字对象s和连接的客户端地址s_ip ,即 s, s_ip = *.accept()。
5.recv() 用于从套接字接受数据。s.recv(1024)表示从套接字中最多接受1024字节的数据。这个函数接收到的是bytes类型的数据。
6.sendall() 用于向套接字发送数据。
7.clase() 用于关闭套接字。
这些函数通常都是需要用到的函数。下面,我们在linux的centos7环境下写一个简单的socket网络编程。使用C/S架构。
2.1 socket-server
2.1.1简单步骤:
2.1.2 编写实例:
# 创建socket对象
sk = socket.socket()
# 绑定ip和端口
sk.bind( ("0.0.0.0",8999) )
# 设置监听,排队队列客户端数
sk.listen(10)
# 进入一个堵塞状态(什么事情都不做,等着),等着客户端的连接
conn, addr = sk.accept()
print("hello")
# conn 为客户端的socket对象
print(f'conn is:{conn}')
# addr 为客户端的端口和地址
print(f'addr is:{addr}')
# recv接收客户端的内容,接收到的是bytes类型数据
while 1:
accept_data = conn.recv(1024)
print(f"接收到的内容是:{accept_data.decode('utf8')}")
# 可以向客户端发送,发送的数据也要为bytes的类型
send_data = input("你要发送的内容是:\n")
conn.sendall(bytes(send_data, encoding="utf8"))
# 关闭连接 (可关可不关)
conn.close()
2.2 socket-client
2.2.1简单步骤:
2.2.2 编写实例:
import socket
sk = socket.socket()
# 连接服务器
sk.connect( ("127.0.0.1",8999) )
while 1:
send_data = input("客户端,发送的内容是:")
sk.sendall(bytes(send_data, encoding="utf8"))
accept_data = sk.recv(1024)
print(f"客户端接收的内容是: {accept_data}")
sk.close()
2.3 测试
若是先运行客户端,但需要连接的服务器又没有运行,这样会出现报错;所以先将服务器运行起来,然后再运行客户端连接服务器。没有出现报错之后,就可以实现C/S之间的相互通信了。
温馨提示:基于网络知识我们可以知道:(1) 0.0.0.0
是用于指定服务器绑定到所有可用网络接口的地址,用于接受来自任何 IP 的连接请求。(2) 127.0.0.1
是指向本地主机的回环地址,用于本地主机内部进行网络通信。 注意:0.0.0.0
和 127.0.0.1
都不能用于在 Internet 上进行实际的网络通信。
这样就成功使用python实现了socket网络编程。