socket编程补充
- 2019 年 10 月 6 日
- 筆記
tcp服务器
udp不区分服务器和客户端的。
在常用模块中我们学习了socket的模块,
并且模拟实现了udp和tcp的客户端,我们知道想要通讯必须是客户端与服务器连接才能通讯,
下面我们来模拟实现tcp的服务器。
实现流程:
1、socket 创建一个套接字
2、bind绑定ip和port
3、listen使套接字变为被动链接(监听套接字)
4、accept等待客户端链接
5、recv/send接收和发送数据
6、关闭套接字
import socket
def main():
# 创建套接字
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地信息
tcp_server.bind(("",7890))
# 将套接字变为被动
tcp_server.listen(128)
# 等待客户端的连接
print('等待')
cli_socket,cli_addr = tcp_server.accept()
# accept()返回一个元组,第一个值接收一个新的套接字,第二个接收连接客户端的地址。
# recv/send接收和发送数据
# cli_socket这个套接字接收消息。
recv_data = cli_socket.recv(1024)
cli_socket.send('ok'.encode('utf-8'))
#关闭套接字
cli_socket.close()
tcp_server.close()
if __name__ == "__main__":
main()
修改一下:
修改成等待多个客户端,并对一个客户端多次服务。
import socket
def main():
# 创建套接字
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 绑定本地信息
tcp_server.bind(("",7890))
# 将套接字变为被动
tcp_server.listen(128)
#128 和操作系统有关,比如一个网站同时有128个人访问。那我们写1000000呢?是不是更多?不是这样
暂时默认写128就行了。
# 等待客户端的连接
while True:
print('等待')
cli_socket,cli_addr = tcp_server.accept()
# accept()返回一个元组,第一个值接收一个新的套接字,第二个接收连接客户端的地址。
while True:
# recv/send接收和发送数据
# cli_socket这个套接字接收消息。
# 这里需要判断对方是否关闭,关闭即服务完毕
recv_data = cli_socket.recv(1024)
# 当recv_data为空,就表示结束服务。
if not recv_data:
cli_socket.send('ok'.encode('utf-8'))
else:
break
#关闭套接字
cli_socket.close()
tcp_server.close()
if __name__ == "__main__":
main()
tcp下载文件
# tcp下载文件客户端
from socket import *
def main():
# 创建套接字
tcp_socket = socket(AF_INET,SOCK_STREAM)
# 输入ip和port
ip = input('输入服务器ip')
port = int(input('输入服务器port'))
# 连接服务器
tcp_socket.connect((ip,port))
# 输入需要下载的文件名
file_name = input('要下载的文件名')
# 发送下载请求
tcp_socket.send(file_name.encode('utf-8'))
# 接收服务器发来的数据1024 = 1k
recv_data = tcp_socket.recv(1024)
# 收到数据创建文件夹,写入数据
if recv_data:
with open("xxx"+file_name,"wb") as file:
file.write(recv_data)
# 关闭套接字
tcp_socket.close()
if __name__ == "__main__":
main()
# tcp下载文件服务端
import socket
def main():
tcp_server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcp_server.bind(("",7891))
tcp_server.listen(128)
cli_socket,cli_addr = tcp_server.accept()
# cli_socket这个套接字接收文件名字。
recv_data = cli_socket.recv(1024).decode('utf-8')
# 发送文件消息
cli_socket.send('我是文件的内容'.encode('utf-8'))
#关闭套接字
cli_socket.close()
tcp_server.close()
if __name__ == "__main__":
main()
其他:
我们在发数据的时候需要一个固定的端口,在接收数据的时候,只要知道对方服务器的端口就可以了。
也就是说,tcp客户端一般不绑定端口,如果绑定不及存在多开了!