socket
在python中,使用socket模块的函数socket就可以完成.
import socket
# 创建tcp套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # udp:SOCK_DGRAM
# 这里使用套接字的功能
# 不用的时候关闭
s.close()
发送消息
import socket
def main():
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
localaddr = ("", 7890)
udp_socket.bind(localaddr)
while True:
# 从键盘获取数据
send_data = input("请输入要发送的数据:")
# 如果输入的exit,则退出
if send_data == "exit":
break
# 可以使用套接字手法数据
udp_socket.sendto(send_data.encode("utf-8"), ("192.168.0.21", 7890))
# 不用的时候关闭
udp_socket.close()
if __name__ == "__main__":
main()
接收消息
import socket
def main():
# 1. 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 2. 绑定一个本地信息
localaddr = ("", 7788)
udp_socket.bind(localaddr) # 必须绑定自己电脑的ip以及port
# 3. 接收数据
while True:
# (b'dkfjkf', ('192.168.0.101', 54660))
# recv_data 里面的数据是一个元组(接收的数据,(发送的ip,port))
recv_data = udp_socket.recvfrom(1024) # 表示接收的最大字节为1024
recv_msg = recv_data[0] # 存储的数据
send_addr = recv_data[1] # 存储发送方的地址信息
# 4. 打印接收到的数据
print("%s:%s" % (str(send_addr), recv_msg.decode("utf-8")))
# 5. 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
套接字在同一台电脑不同程序之间进行收发数据
import socket
def send_msg(udp_socket):
# 获取对方的ip/port
dest_ip = input("请输入对方的ip:")
dest_port = int(input("请输入对方的port:"))
send_data = input("请输入要发送的数据:")
# 使用套接字发送数据
udp_socket.sendto(send_data.encode("utf-8"), (dest_ip, dest_port))
def receive_data(udp_socket):
# 使用套接字接收数据
recv_data = udp_socket.recvfrom(1024)
print(recv_data)
def main():
# 创建udp套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定端口
localaddr = ("", 7890)
udp_socket.bind(localaddr)
while True:
print("--------聊天--------")
print("1发送数据 2接收数据 0退出")
op = input("请输入你的操作:")
if op == "1":
send_msg(udp_socket)
elif op == "2":
receive_data(udp_socket)
elif op == "0":
break
else:
print("请输入正确的操作方式")
# 不用的时候关闭
udp_socket.close()
if __name__ == "__main__":
main()
单双工:只能接收数据,如收音机。
半双工:同一时间只能接收或者发送数据,如对讲机。
全双工:同一时间既可以发送数据,也可以接收数据,如电话。
socket是全双工的通讯模式。
tcp客户端
import socket
def main():
# 1. 创建socket
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 链接服务器
server_ip = input("请输入要链接的服务器的ip:")
server_port = int(input("请输入要链接的服务器的port:"))
server_addr = (server_ip, server_port)
tcp_socket.connect(server_addr)
# tcp_socket.connect(("192.168.0.21", 7890))
# 3. 发送数据、接收数据
send_data = input("请输入要发送的数据:")
tcp_socket.send(send_data.encode("utf-8"))
# 4. 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
tcp服务端
import socket
def main():
# 1. 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. bind ip和port
tcp_server_socket.bind(("192.168.0.21", 7890))
# 3. 使用socket创建的套接字默认的属性是主动地,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)
while True:
# 4. 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# tcp_server_socket 就可以省下来专门等待其他的客户端的链接
# client_socket 用来为这个客户端服务
new_client_socket, client_addr = tcp_server_socket.accept()
print("一个新的客户端已经来到%s" % str(client_addr))
# 循环为一个客户端服务
while True:
# 5. 接收对方发过来的数据
recv_data = new_client_socket.recv(1024) # 接收1024个字节
print("接收到的数据为:", recv_data.decode("utf-8"))
# 如果recv解堵塞,那么有两种方式
# 一是客户端发送过来数据
# 另一种客户端调用close导致解堵塞
if recv_data:
# 回送一部分数据给客户端
new_client_socket.send("hello".encode("utf-8"))
else:
break
# 6. 关闭这个为客户端服务的套接字,只要关闭了,就意味着不能在为这个客户端服务了
new_client_socket.close()
print("已经服务完毕")
tcp_server_socket.close()
if __name__ == "__main__":
main()
文件下载
import socket
def main():
# 1. 创建套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 获取服务器的ip port
dest_ip = input("请输入服务器的ip:")
dest_port = int(input("请输入服务器的port:"))
# 3. 链接服务器
tcp_socket.connect((dest_ip, dest_port))
# 4. 获取下载的文件名
download_file_name = input("请输入要下载的文件名字:")
# 5. 将文件名字发送到服务器
tcp_socket.send(download_file_name.encode("utf-8"))
# 6. 接收文件中的数据
recv_data = tcp_socket.recv(1024)
if recv_data:
# 7. 保存接收到的数据到一个文件中
with open("[新]" + download_file_name, "wb") as f:
f.write(recv_data)
# 8. 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
网友评论