目录
网络编程是指通过计算机网络进行信息交换与通信的技术。网网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。在计算机网络中,最常见的两种通信协议是TCP和UDP。
TCP(TransmissionControl Protocol,传输控制协议)是一种面向连接的协议,提供可靠的、按顺序到达的通信服务。TCP协议通过三次握手建立连接,并通过四次挥手断开连接。其主要特点如下:面向连接:TCP需要在数据传输前建立连接。数据传输之前,发送方和接收方需要通过三次握手来确认连接的可靠性。可靠性:TCP通过序列号、确认应答、重传机制等方式保证数据国的可靠传输。如果数据丢失或损坏,TCP会自动进行重传。流量控制:TCP通过滑动窗口技术来控制数据传输速率,防止接收方处理不过来数据。有序性:数据包的接收顺序由TCP保证,接收方会按序号将数据重新组装在实际应用中,TCP适合于那些对数据的可靠性和顺序性有严格要求的场景,例如文件传输、电子邮件等。
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的协议,它的主要特点是简单、快速,但不保证数据的可靠性和顺序。UDP协议的主要特点如下:
无连接:UDP不需要建立连接,因此通信双方无需进行握手。不可靠传输:UDP不提供确认应答机制,也不保证数据到达的顺序,可能会丢包或出现乱序的情况。
速度较快:由于不需要建立连接和处理数据传输的复杂生,UDP在传输过程中速度较快,适合用于实时性要求较高的应用场景。适用于广播和多播:UDP支持广播和多播,可以在网络中同时向多个接收方发送数据。UDP适用于那些对实时性要求较高,但不要求数据可靠性保障的场景,例如在线游戏、视频会议等。
Socket是网络通信的基础,是实现网络编程的抽象层。在Python中,socket模块提供了对Socket的封装,使得我们可以轻松实现TCP和UDP通信。Socket接口提供了发送、接收、连接、断开等操作,允许我们在程序中实现网络通信。
IPv4和IPv6:Socket支持IPv4和IPv6协议,通过指定不同的地址族(AF_INET表示IPV4,
AF INET6表示IPV6)可以支持不同的网络环境。
协议类型:Python的Socket模块支持两种主要的协议类型:SOCK_STREAM表示TCP协议,SOCK_DGRAM表示UDP协议。
在TCP编程中,客户端和服务器之间的通信需要经过连接的建立和断开
import socket
s=socket.socket()
host='192.168.10.101'
port=12345
s.connect((host,port))
print('已经建立连接')
info=''
while info !='bye':
send_data=input('请输入你要发送的信息:')
send_data=str(send_data)
s.send(send_data.encode())
if send_data=='bye':
break
info=s.recv(1024).decode()
print('接收到的信息:'+info)
s.close()
import socket
host='192.168.10.101'
port=12345
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind((host,port))
s.listen(1)
sock,addr=s.accept()
print('建立连接成功')
info=sock.recv(1024).decode('utf-8')
while info !='bye':
if info:
print('收到的信息是:' +info)
send_data=input('请输入你要发送的信息:')
send_data=str(send_data)
sock.send(send_data.encode())
if send_data=='bye':
break
info=sock.recv(1024).decode()
sock.close()
s.close()
server_socket.bind(('127.0.0.1',12345)):绑定服务器的I地址和端口。
server_socket.listen(5):开始监听连接,最大连接数为5。
server_socket.accept():接受客户端连接。
client_socket.recv(1024):接收客户端消息。
client_socket.send(b'Hello,Client'):向客户端发送啊应消息。
client_socket.close():关闭与客户端的连接。
UDP编程
UDP编程与TCP编程的最大区别在于UDP不需要建立连接,客户端和服务器直接发送和接受数据
import socket
def udp_client():
client_socket = socket.socket(socket.AF_INET, socketSOCK_DGRAM)
message = 'Hello, UDP Server'
client_socket.sendto(message.encode('utf-8'), ('127.0.0.1', 12345)
response, server_address = client_socket.recvfrom(1024)
print('Received from server:', response.decode('ut(f-8'))
client_socket.close
if __name__ == '__main__':
udp_client()
socket.socket(socket.AF_INET, socket.SOCK_DGRAM):创建UDP客户端Socket。
client_socket.sendto():发送数据到指定的目标地址和端口1。
client_socket.recvfrom():接收来自服务器的响应,返回接收收到的数据和服务器地址
import socket
def udp_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('127.0.0.1', 12345))
print('Server is listening...')
while True:
message, client_address = server_socket.recvfrom(1024)
print(f'Received message: {message.decode("utf-8(.{(")
server_socket.sendto(b'Hello, UDP Client', client_aaddress
if __name __ == 'main__':
udp_server()
server_socket.bind(('127.0.0.1',12345)):绑定服务器的IP地址和端口。
server_socket.recvfrom(1024):接收来自客户端的数据,并返回数据和客户端地址
server_socket.sendto():向指定客户端地址发送响应数据。
设置一个简单的TCP聊天内容客户端和服务器通过TCP协议进行通信,客户端发送消息,服务器接受并返回并响应
import socket
def tcp_chat_client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('127.0.0.1', 12345))
while True:
message = input('You: ')
if message.lower() == 'exit':
break
client_socket.send(message.encode('utf-8'))
response = client_socket.recv(1024)
print('Server:', response.decode('utf-8'))
client_socket.close()
if __name__ == '__main__':
tcp_chat_client()
import socket
def tcp_chat_server():
server_socket = socket.socket(socket.AF_INET, socketSOCK_STREAM)
server_socket.bind(('127.0.0.1',12345))
server_socket.listen(5)
print('Server is waiting for connection...')
client_socket, client_address = server_socket.adccept()
print(f'Connection established with {client_address}')
while True:
message = client_socket.recv(1024)
if not message:
break
print('Client:', message.decode('utf-8'))
response = input('You: ')
client_socket.send(response.encode('utf-8'))
client_socket.close
server_socket.close()
if __name__ == '__main__':
tcp_chat_server()