socket可以在网络间进行通信, 基本上有两种通信协议, 一种是TCP, 一种是UDP.
UDP是一种面向无链接的通信协议, 通信前无需与对端建立连接. 只要有目的ip地址和port端口, 就可以将数据内容发送给对方. 但是无法确定数据是否正确, 传送给了对方. 所以UDP是一种不可靠的通信协议.
相比较之下, TCP是一种面向链接的通信协议, 需要和对方先建立链接(三次握手)再进行通信. 对于收到数据包也有ACK回应, 通过超时重传, 数据检验, 保证了数据传输的可靠性.
由于UDP的实现无需区分客户端和服务器端, 所以为了快速实现一个对话聊天软件, 我使用UDP作为socket的通信协议.
第一步: 创建socket并绑定端口
import socket
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ('', 12345)
udp_socket.bind(addr)
第二步: 创建接收消息和发送消息的子线程
import threading
# 发送消息
def send_message():
while True:
content = input()
udp_socket.sendto(content.encode("utf-8"), dest_addr)
if content=="exit":
udp_socket.close()
# 接收消息
def recv_meassage():
while True:
recv_data = udp_socket.recvfrom(1024)
print("对方:{}".format(recv_data[0].decode("utf-8")))
t_send = threading.Thread(target=send_message)
t_recv = threading.Thread(target=recv_meassage)
第三步: 确定window的ip和linux的ip(端口的话我自己给定)
dest_addr = ('192.168.178.128', 7788)
最后得到了总体代码:
代码写一份就可以了, 另外copy一份, 修改addr 和dest_addr的ip和端口就可以通信了, 这也是UDP的快速使用.
import socket
import threading
def send_message():
while True:
content = input()
udp_socket.sendto(content.encode("utf-8"), dest_addr)
if content=="exit":
udp_socket.close()
def recv_meassage():
while True:
recv_data = udp_socket.recvfrom(1024)
print("对方:{}".format(recv_data[0].decode("utf-8")))
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ('', 12345)
udp_socket.bind(addr)
print("chatting with 7788")
dest_addr = ('192.168.178.128', 7788)
t_send = threading.Thread(target=send_message)
t_recv = threading.Thread(target=recv_meassage)
t_send.start()
t_recv.start()
运行结果:
window:
image.png
linux:
image.png