套接字(Socket)是在网络通信中使用的一种编程接口,它提供了一种通过网络进行数据传输的机制。在低级别的网络编程中,套接字用于建立客户端和服务器之间的连接,并实现数据的发送和接收。
套接字提供了一种抽象层,使得程序员可以通过简单的函数调用进行网络通信。通过套接字,可以使用不同的协议(如TCP、UDP、IP等)来实现不同的数据传输方式。
在程序中创建套接字时,可以指定套接字的类型(TCP套接字、UDP套接字等)和地址族(如IPv4、IPv6等)。一旦套接字创建成功,就可以使用该套接字进行连接、发送数据和接收数据等操作。
使用套接字编程,可以实现各种网络应用,如Web服务器、聊天程序、文件传输等。套接字提供了灵活而强大的工具,使得网络通信变得简单和高效。
socket套接字双端通信
服务器端:
from socket import *
from threading import Thread
def handle_client(client_socket, client_info):
while True:
recv_data = client_socket.recv(1024)
recv_content = recv_data.decode("gbk")
print(f"客户端说:{recv_content},来自:{client_info}")
if recv_content == 'end':
print("结束接收消息!!!")
break
client_socket.close()
if __name__ == '__main__':
server_socket = socket(AF_INET, SOCK_STREAM)
server_socket.bind(("192.168.8.15", 8894))
server_socket.listen(5)
print("等待接受连接")
while True:
client_socket, client_info = server_socket.accept()
print("一个客户端建立连接成功!")
t = Thread(target=handle_client, args=(client_socket, client_info))
t.start()
客户端
from socket import *
from threading import *
def recv_data():
while True:
recv_data = client_socket.recv(1024)
recv_content = recv_data.decode('gbk')
print(f'服务器端说{recv_content}')
if recv_content == 'end':
print('结束接受信息')
def send_data():
while True:
msg = input('>>>')
client_socket.send(msg.encode('gbk'))
if msg == 'end':
break
if __name__ == '__main__':
client_socket = socket(AF_INET, SOCK_STREAM)
client_socket.connect(('192.168.137.116', 8899))
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t1.start()
t2.start()
t1.join()
t2.join()
client_socket.close()
使用的socket函数:
-
socket(af, socktype)
: 创建一个新的套接字对象。af
参数指定地址族,通常使用AF_INET
表示IPv4地址族;socktype
参数指定套接字类型,通常使用SOCK_STREAM
表示TCP套接字。 -
bind(address)
: 将套接字绑定到指定的地址。address
参数是一个元组,包含IP地址和端口号。 -
listen(backlog)
: 监听套接字上的连接。backlog
参数指定在连接队列中排队的最大连接数。 -
accept()
: 接受客户端的连接请求,并返回与客户端建立的新套接字对象以及客户端的地址信息。该函数在接收到连接请求之前一直阻塞。 -
recv(bufsize)
: 从套接字接收数据。bufsize
参数指定每次接收的最大数据量。 -
send(bytes)
: 发送数据到套接字。bytes
参数是一个字节数组,表示要发送的数据。 -
decode(encoding)
: 将字节数据解码成字符串。encoding
参数指定解码使用的字符编码。 -
encode(encoding)
: 将字符串编码为字节数据。encoding
参数指定编码使用的字符编码。 -
close()
: 关闭套接字。
通过使用这些函数,可以创建服务器套接字、绑定地址和端口、监听连接请求、接受客户端连接、接收和发送数据,并最后关闭连接。这样就实现了一个基于TCP的服务器。