关于socket通信的定义和原理,我们再熟系不过了,这里就不在赘述,不了解的读者可以参考博客:
https://www.cnblogs.com/wangcq/p/3520400.html
这里讲的很明白。
以前,使用C/C++、Java都实现过,最近学习Python,又实现了一遍;不得不说,Python的代码真的是十分简洁(在我心中完全取代了Java),也可以看出socket真的是网络编程的经典案例。话不多说,言归正传;下面,我将用UDP实现四种不同的通信方式。
第一种:一端只能发送信息,另一端只能接收信息;
第二种:自己发给自己(自发自收);
第三种:简易聊天器,你发给我一条信息,我收到后,再发给你一条信息,你接收后,再发给我一条信息……如此往复。
第四种: 简易聊天器,随意收发。(2019-1-6 补充)
一、客户端发送信息,服务端接收信息
客户端代码:
#coding:utf-8
import socket
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_socket.bind(("172.21.13.10",6060))
while True:
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 可以使用套接字收发数据
localaddr = ("172.21.13.10",8080)
#udp_socket.bind(localaddr)
udp_socket.sendto(send_data.encode("utf-8"),localaddr)
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
服务端代码:
#coding:utf-8
import socket
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# 绑定一个本地信息
localaddr = ("172.21.13.10",8080)
udp_socket.bind(localaddr)
while True:
# 接收数据
receive_data = udp_socket.recvfrom(1024)
# receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
receive_msg = receive_data[0] # 存放接收的数据
receive_addr = receive_data[1] # 存放发送方的地址
print("%s:%s" % (str(receive_addr),receive_msg.decode("utf-8")))
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
二、自发自收信息
代码:
#coding:utf-8
import socket
def send_msg(udp_socket):
"""发送消息"""
# 发送
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 可以使用套接字收发数据
localaddr = ("172.21.13.10", 8088)
udp_socket.sendto(send_data.encode("utf-8"), localaddr)
def receive_msg(udp_socket):
"""接收消息"""
# 接收并显示
receive_data = udp_socket.recvfrom(1024)
# receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
receive_msg = receive_data[0] # 存放接收的数据
receive_addr = receive_data[1] # 存放发送方的地址
print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("172.21.13.10", 8088))
# 循环处理事情
while True:
# 发送
send_msg(udp_socket)
# 接收并显示
receive_msg(udp_socket)
if __name__ == "__main__":
main()
三、简易聊天器
先发端代码:
#coding:utf-8
import socket
def send_msg(udp_socket):
"""发送消息"""
# 发送
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 可以使用套接字收发数据
localaddr = ("172.21.13.10", 8088)
udp_socket.sendto(send_data.encode("utf-8"), localaddr)
def receive_msg(udp_socket):
"""接收消息"""
# 接收并显示
receive_data = udp_socket.recvfrom(1024)
# receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
receive_msg = receive_data[0] # 存放接收的数据
receive_addr = receive_data[1] # 存放发送方的地址
print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("172.21.13.10", 8080))
# 循环处理事情
while True:
# 发送
send_msg(udp_socket)
# 接收并显示
receive_msg(udp_socket)
if __name__ == "__main__":
main()
先收端代码:
#coding:utf-8
import socket
def send_msg(udp_socket):
"""发送消息"""
# 发送
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 可以使用套接字收发数据
localaddr = ("172.21.13.10", 8080)
udp_socket.sendto(send_data.encode("utf-8"), localaddr)
def receive_msg(udp_socket):
"""接收消息"""
# 接收并显示
receive_data = udp_socket.recvfrom(1024)
# receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
receive_msg = receive_data[0] # 存放接收的数据
receive_addr = receive_data[1] # 存放发送方的地址
print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("172.21.13.10", 8088))
# 循环处理事情
while True:
# 接收并显示
receive_msg(udp_socket)
# 发送
send_msg(udp_socket)
if __name__ == "__main__":
main()
四、 简易聊天器(随意收发)
A端:
#coding=utf-8
import socket
import threading
def send_msg(udp_socket):
"""发送消息"""
while True:
# 发送
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 可以使用套接字收发数据
localaddr = ("172.21.13.10", 8080)
udp_socket.sendto(send_data.encode("utf-8"), localaddr)
def receive_msg(udp_socket):
"""接收消息"""
while True:
# 接收并显示
receive_data = udp_socket.recvfrom(1024)
# receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
receive_msg = receive_data[0] # 存放接收的数据
receive_addr = receive_data[1] # 存放发送方的地址
print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("172.21.13.10", 8088))
# 创建两个线程
t_recv = threading.Thread(target=receive_msg, args=(udp_socket,))
t_send = threading.Thread(target=send_msg, args=(udp_socket,))
t_send.start()
t_recv.start()
if __name__ == "__main__":
main()
B端:
#coding=utf-8
import socket
import threading
def send_msg(udp_socket):
"""发送消息"""
while True:
# 发送
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 可以使用套接字收发数据
localaddr = ("172.21.13.10", 8088)
udp_socket.sendto(send_data.encode("utf-8"), localaddr)
def receive_msg(udp_socket):
"""接收消息"""
while True:
# 接收并显示
receive_data = udp_socket.recvfrom(1024)
# receive_data接收的为元组(b'c', ('172.21.13.10', 55897))
receive_msg = receive_data[0] # 存放接收的数据
receive_addr = receive_data[1] # 存放发送方的地址
print("%s:%s" % (str(receive_addr), receive_msg.decode("utf-8")))
def main():
# 创建一个udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定信息
udp_socket.bind(("172.21.13.10", 8080))
# 创建两个线程
t_recv = threading.Thread(target=receive_msg,args=(udp_socket,))
t_send = threading.Thread(target=send_msg, args=(udp_socket,))
t_recv.start()
t_send.start()
if __name__ == "__main__":
main()
五、补充(TCP)2019-1-4
客户端:
#coding:utf-8
import socket
def main():
# 1.创建tcp的套接字
tcp_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.链接服务器
server_ip = "172.21.13.10"
server_port = 8080
server_addr = (server_ip,server_port)
tcp_socket.connect(server_addr)
# 3.发送/接收数据
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8"))
recv_data = tcp_socket.recv(1024)
print(recv_data)
# 4.关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
服务器:
#coding:utf-8
import socket
def main():
# 1.创建套接字
tcp_server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 2.绑定本地信息
localaddr = ("172.21.13.10", 8080)
tcp_server_socket.bind(localaddr)
# 3.让默认的套接字由主动变为被动
tcp_server_socket.listen(128)
# 4.等待客户端链接
client_socket,client_addr = tcp_server_socket.accept()
print(client_addr)
recv_data = client_socket.recv(1024)
print(recv_data)
# 回复信息
client_socket.send("11111".encode("utf-8"))
# 5. 关闭套接字
client_socket.close()
tcp_server_socket.close()
if __name__ == "__main__":
main()