本机的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()

一些补充问题

  1. :本机不同进程之间使用TCP通信,需不需要将通信数据封装为TCP报文? :在本机不同进程之间使用TCP通信时,数据不需要封装为TCP报文。TCP协议是传输层协议,它负责提供可靠的、面向连接的数据传输服务。

    当两个进程在同一台主机上进行TCP通信时,它们可以直接通过操作系统的套接字(Socket)接口进行通信。通过套接字接口,进程可以发送和接收数据,而无需显式地将数据封装为TCP报文。

    在本机的TCP通信中,操作系统会自动处理TCP报文的封装和解封装,包括添加TCP协议头部、计算校验和等操作。进程只需要调用套接字接口提供的发送和接收函数,将数据发送到对应的套接字或从套接字接收数据即可。

    因此,在本机不同进程之间的TCP通信中,数据不需要手动封装为TCP报文。该操作由操作系统和套接字接口自动处理。
  2. :同一局域网下不同ip的主机,在使用tcp通信时,需要将通信内容封装为tcp报文吗?

:是的,在同一局域网下不同IP的主机之间使用TCP通信时,通信内容需要封装为TCP报文。


TCP协议是一种面向连接的可靠传输协议,在发送数据之前,需要将数据封装为TCP报文,并在报文中包含必要的控制信息。封装TCP报文的过程由操作系统的网络协议栈自动完成。


当应用程序通过套接字接口发送数据时,操作系统会将数据分割为适当大小的数据块,然后将每个数据块封装为TCP报文。TCP报文包括源IP地址、目标IP地址、源端口号、目标端口号、序列号、确认号、窗口大小等字段,以及校验和等控制信息。


接收端的操作系统会解析TCP报文,提取出数据并进行相应的处理。TCP协议负责保证数据的可靠传输,处理丢包、重传、流量控制等问题。


因此,在同一局域网下不同IP的主机之间使用TCP通信时,需要将通信内容封装为TCP报文,以便正确传输和处理数据。这个过程在操作系统的网络协议栈中自动完成,应用程序无需手动封装报文。


本人在使用Wireshark对该进程所调用的端口进行监听时,想要得到该端口的所有数据包(TCP报文),但并未抓取到任何数据包。在同机不同进行进行TCP通信时,应该是操作系统后台直接对端口数据进行传输。