TCP服务器程序
import socket
def tcp_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('127.0.0.1', 12345))
server_socket.listen(1)
print('Server is listening on port 12345')
while True:
client_socket, client_address = server_socket.accept()
print(f'Connected by {client_address}')
data = client_socket.recv(1024).decode('utf-8')
reversed_data = data[::-1]
client_socket.send(reversed_data.encode('utf-8'))
client_socket.close()
if __name__ == '__main__':
tcp_server()
TCP客户端程序
import socket
def tcp_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))
message = "Hello, Server!"
client_socket.send(message.encode('utf-8'))
data = client_socket.recv(1024).decode('utf-8')
print(f"Received from server: {data}")
client_socket.close()
if __name__ == '__main__':
tcp_client()
TCP和UDP主要区别
- 连接方式:
- TCP:面向连接的协议。在数据传输之前,客户端和服务器之间需要建立一个可靠的连接,就像打电话,双方要先接通才能交流。建立连接需要进行三次握手,传输完毕后需要四次挥手来断开连接。
- UDP:无连接的协议。就像发短信,不需要事先建立连接,直接将数据发送出去,不管对方是否准备好接收。
- 可靠性:
- TCP:提供可靠的数据传输。它通过序列号、确认应答、重传机制等保证数据能准确无误地到达接收方。如果数据在传输过程中丢失或损坏,TCP会自动重传。
- UDP:不保证数据的可靠传输。数据可能会在传输过程中丢失、重复或乱序到达,应用程序需要自己处理这些情况。
- 传输效率:
- TCP:由于要保证可靠性,有较多的控制机制,如流量控制、拥塞控制等,因此传输效率相对较低,尤其在网络环境较差时,可能会频繁重传数据影响效率。
- UDP:没有复杂的控制机制,开销小,传输效率高,适合对实时性要求高但对数据准确性要求相对较低的场景,如视频流、音频流传输。
- 数据边界:
- TCP:是字节流协议,没有数据边界。发送方连续发送的数据,接收方可能分多次接收,需要应用层自己处理数据边界问题。
- UDP:是数据报协议,有数据边界。发送方发送的一个UDP数据报,接收方要么完整接收,要么接收不到,不会出现部分接收的情况。