一、理论
网络编程是指通过计算机网络进行信息交换与通信的技术。网络通信依赖于网络协议,网络协议规定了数据传输的格式、方法以及数据交互的规则。常见的通信协议是tcp和udp。
TCP(transmission control protocol,传输控制协议)
面向连接
可靠
按序到达
三次握手建立连接、四次挥手断开连接。
UDP(User Datagram Protocol,用户数据报协议)
无连接
简单
快速
socket是网络通信的基础,是实现网络编程的抽象层。位于tcp模型中传输层和应用层之间。在osi模型中属于会话层。
二、实践
tcp服务器和客户端
服务器 101
[root@localhost ~]# vim b.py
import socket
def tcp_server():
server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server_socket.bind(('192.168.10.101',12345))
server_socket.listen(5)
print('server is listening...')
while True:
client_socket,client_address=server_socket.accept()
print(f'connection from {client_address}')
message=client_socket.recv(1024)
print(f'Received message: {message.decode("utf-8")}')
client_socket.send(b'Hello,Client')
client_socket.close()
if __name__=='__main__':
tcp_server()
客户端 102
[root@localhost ~]# vi c.py
import socket
def tcp_client():
# AF_INET表示ipv4协议,SOCK_STREAM表示TCP协议
client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect(('192.168.10.101',12345))
message='Hello,Server'
client_socket.send(message.encode('utf-8'))
response=client_socket.recv(1024)
print('Received from server:',response.decode('utf-8'))
client_socket.close()
if __name__=='__main__':
tcp_client()
101
[root@localhost ~]# firewall-cmd --add-port=12345/tcp
success
[root@localhost ~]# python3 b.py
server is listening...
connection from ('192.168.10.102', 59848)
Received message: Hello,Server
connection from ('192.168.10.102', 55464)
Received message: Hello,Server
102
[root@localhost ~]# python3 c.py
Received from server: Hello,Client
[root@localhost ~]# python3 c.py
Received from server: Hello,Client
UDP客户端与服务端
101服务端
import socket
def udp_server():
server_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
server_socket.bind(('192.168.10.101',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_address)
if __name__=='__main__':
udp_server()
102客户端
import socket
def udp_client():
client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
message='Hello,UDP Server'
client_socket.sendto(message.encode('utf-8'),('192.168.10.101',12345))
response,server_address=client_socket.recvfrom(1024)
print('Received from server:',response.decode('utf-8'))
client_socket.close()
if __name__=='__main__':
udp_client()
102
[root@localhost ~]# python3 aa.py
Received from server: Hello,UDP Client
101
[root@localhost ~]# python3 aa.py
Server is listening...
Received message: Hello,UDP Server
TCP简易聊天
客户端
import socket
def tcp_chat_client():
client_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client_socket.connect(('192.168.10.101',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,socket.SOCK_STREAM)
server_socket.bind(('192.168.10.101',12345))
server_socket.listen(5)
print('server is waiting for connection...')
client_socket,client_address=server_socket.accept()
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()
101
[root@localhost ~]# python3 bb.py
server is waiting for connection...
102
[root@localhost ~]# python3 bb.py
you:
102
[root@localhost ~]# python3 bb.py
you:1
server: 2
you:3
server: 4
you:5
server: exit
you:exit
101
[root@localhost ~]# python3 bb.py
server is waiting for connection...
Connection established with ('192.168.10.102', 42506)
Client: 1
you:2
Client: 3
you:4
Client: 5
you:exit