前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >socket编程补充

socket编程补充

作者头像
不断折腾
发布2019-09-23 10:46:37
5730
发布2019-09-23 10:46:37
举报
文章被收录于专栏:折腾折腾再折腾

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客户端一般不绑定端口,如果绑定不及存在多开了!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python入门到放弃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档