目录
socket
server_socket = socket(AF_INET,SOCK_STREAM)
用于创建一个 AF_INET 类型的 TCP 套接字。它使用的套接字类型是 SOCK_STREAM,这对应于面向连接的可靠的字节流传输。
bind
server_socket.bind(("192.168.8.143",8899))
调用 bind() 函数将套接字与特定的 IP 地址和端口号绑定在一起。
使用了一个服务器套接字 server_socket,并将其绑定到 IP 地址 “192.168.8.143” 和端口号 8899 上。
listen
server_socket.listen(5)
listen()
函数将服务器套接字置于监听状态,以等待客户端的连接。
server_socket.listen(5)
这行代码用于让服务器套接字进入监听状态,并指定同时接受的最大连接数为 5。
accept
client_socket, client_info = server_socket.accept()
accept()
函数被调用。它会阻塞程序的执行,直到有客户端连接到服务器。一旦有客户端连接,accept()
函数将会返回一个新的套接字对象 client_socket
,用于与该客户端进行通信。
server_socket.accept()
用于接受客户端的连接请求,并返回一个新的套接字对象 client_socket
,以及客户端的地址信息 client_info
。
Thread
Thread(target=recv_data,args=(client_socket,client_info))
代码利用多线程创建了一个子线程,用于接收数据。
target
参数指定了在子线程中要执行的函数
args
参数是一个元组,包含了传递给 recv_data
函数的参数
start
start()
是用于启动子进程的方法。但在网络编程中,我们通常是使用 start()
方法来启动客户端连接,而不是启动子进程。
recv
recv_data=client_socket.recv(1024)
是用于在套接字,它会尝试从对应的客户端接收最多指定字节数(这里是 1024 字节)的数据。
decode
recv_data.decode('gbk')
将接收到的数据(假设是使用GBK编码的字节串)解码为字符串的操作。
在网络通信中,数据在传输过程中通常以字节串的形式进行传输,因此接收的数据也是以字节串的形式表示。如果你知道数据使用的是特定的字符编码(例如GBK、UTF-8等),你可以使用 .decode()
方法将字节串解码成对应的字符串。
close
client_socket.close()
用于关闭套接字连接的方法。
在网络通信中,当服务器与客户端之间的通信结束后,通常需要调用 close()
方法关闭连接,释放资源。
自己写的一个服务和客户通信
服务:
from socket import *
from threading import Thread
def recv_data(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()
def send_data(client_socket,client_info):
while True:
msg = input('>')
client_socket.send(msg.encode('gbk'))
if msg == 'end':
print('结束发消息')
break
client_socket.close()
if __name__ == '__main__':
server_socket = socket(AF_INET,SOCK_STREAM)
server_socket.bind(("192.168.8.143",8899))
server_socket.listen(5)
print('等待连接')
while True:
client_socket, client_info = server_socket.accept()
print("一个客户端建立连接成功!")
t = Thread(target=recv_data,args=(client_socket,client_info))
t2 = Thread(target=send_data,args=(client_socket,client_info))
t .start()
t2.start()
客户:
from socket import *
from threading import Thread
def recv_data():
while True:
recv = client_socket.recv(1024)
recv_content = recv.decode('gbk')
print(f'服务端说:{recv_content}')
if recv_content == 'end':
print('结束接收消息')
break
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(("localhost", 8899))
t1 = Thread(target=recv_data)
t2 = Thread(target=send_data)
t1.start()
t2.start()