本机的socket通信
服务器
每隔5s向连接的客户端发送一个随机数
代码实例
import socket
import random
import time
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定IP和端口
host = '127.0.0.1'
port = 12345
server_socket.bind((host, port))
# 设置最大连接数
server_socket.listen(5)
# 等待客户端连接
client_socket, addr = server_socket.accept()
print('客户端已连接:', addr)
while True:
# 生成随机整数
random_num = random.randint(1, 100)
# 发送数据给客户端
client_socket.send(str(random_num).encode())
print('发送随机数:', random_num)
# 等待5秒
time.sleep(5)
# 关闭连接
client_socket.close()
server_socket.close()
客户端
import socket
ip = '127.0.0.1'
server_port = 12345
buflen = 10
#实例化一个socket对象,指明协议(tcp/ip协议)
dataSocket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#连接服务端socket
try:
dataSocket.connect((ip,server_port))
print("已连接服务器")
#接收数据并显示
while True:
receive_date = dataSocket.recv(buflen)
#解码接收到的数据,并打印
receive_number = receive_date.decode()
print(receive_number)
# 将数据保存到txt文件
with open('save.txt', 'a') as file:
file.write(receive_number + '\n')
except ConnectionRefusedError:
print('连接失败')
finally:
dataSocket.close()
一些补充问题
- 问:本机不同进程之间使用TCP通信,需不需要将通信数据封装为TCP报文? 答:在本机不同进程之间使用TCP通信时,数据不需要封装为TCP报文。TCP协议是传输层协议,它负责提供可靠的、面向连接的数据传输服务。
当两个进程在同一台主机上进行TCP通信时,它们可以直接通过操作系统的套接字(Socket)接口进行通信。通过套接字接口,进程可以发送和接收数据,而无需显式地将数据封装为TCP报文。
在本机的TCP通信中,操作系统会自动处理TCP报文的封装和解封装,包括添加TCP协议头部、计算校验和等操作。进程只需要调用套接字接口提供的发送和接收函数,将数据发送到对应的套接字或从套接字接收数据即可。
因此,在本机不同进程之间的TCP通信中,数据不需要手动封装为TCP报文。该操作由操作系统和套接字接口自动处理。
- 问:同一局域网下不同ip的主机,在使用tcp通信时,需要将通信内容封装为tcp报文吗?
答:是的,在同一局域网下不同IP的主机之间使用TCP通信时,通信内容需要封装为TCP报文。
TCP协议是一种面向连接的可靠传输协议,在发送数据之前,需要将数据封装为TCP报文,并在报文中包含必要的控制信息。封装TCP报文的过程由操作系统的网络协议栈自动完成。
当应用程序通过套接字接口发送数据时,操作系统会将数据分割为适当大小的数据块,然后将每个数据块封装为TCP报文。TCP报文包括源IP地址、目标IP地址、源端口号、目标端口号、序列号、确认号、窗口大小等字段,以及校验和等控制信息。
接收端的操作系统会解析TCP报文,提取出数据并进行相应的处理。TCP协议负责保证数据的可靠传输,处理丢包、重传、流量控制等问题。
因此,在同一局域网下不同IP的主机之间使用TCP通信时,需要将通信内容封装为TCP报文,以便正确传输和处理数据。这个过程在操作系统的网络协议栈中自动完成,应用程序无需手动封装报文。
本人在使用Wireshark对该进程所调用的端口进行监听时,想要得到该端口的所有数据包(TCP报文),但并未抓取到任何数据包。在同机不同进行进行TCP通信时,应该是操作系统后台直接对端口数据进行传输。