前言
本文主要介绍了关于Python中TCP socket的写法,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
一、 服务器server的写法:
1. 创建 socket 套接字:
网络编程接口 socket(family = AF_INET , type = SOCKET_STREM,proto = 0, fileno = None) 提供了多种socket family。AF_INET 是默认的family,需要绑定IP和端口。 127.0.0.1是一个特殊的IP地址,表示本机地址。如果绑定到这个地址,客户端必须同时在本机运行才能连接,也就是说,外部的计算机无法连接进来。
不同的协议family使用的地址形式不同,通常来说我们使用的是AF_INET-----地址是以(IP,PORT)形式存。在type 类型,我们常用的有两种 SOCKET_STREM ,流式套接字,表示基于连接的TCP套接字,SOCKET_DGRAM, 数据报套接字,基于无连接的(UDP)接口。 如果不设定,默认就是 SOCKET_STREM 。
2. bind 绑定
使用方法:socket.bind(address) 把套接字绑定在 address 上,address的形式 根据 family 来设定。不管是client还是server,创建socket的时候都是通过一个本地的文件来进行的。
3. listen 监听
使用方法:socket.listen([backlog]) 使能 socket 接收连接请求,listen(self,backlog = None) ,backlog需要大于0,指定了可以缓存的连接请求的数量。
4. accept 接受请求连接
在等待一个即将来临的连接,会返回一个代表连接的新的socket,还会返回一个地址(host和port),可以用两个东西接收,前一个代表新的socket,后一个就是接收地址。
写的方法:connet_socket,client_addr = srv.accept() connet_socket就是新的socket,然后connet_socket开始接下来的传输。connet_socket,client_addr,前者表示接收的新的socket,后者就是地址,具体看程序第10行。
5. 接收数据
使用方法:socket.recv(bufsize[,flags]) 从 socket 中接收数据,返回的是 bytes ,是接收到的内容。bufsize指定了一次最多接收多少个数据,如果没有数据接收,程序会阻塞,一直到有数据或者远程终端断开连接.
6. 发送数据
使用方法:socket.send(bytes[, flags]) 你的socket必须和远程的socket建立了联系,返回值是发送的数量,可以判断你的数据是否发送完毕,如果没有,继续send余下来的数据
import socket hostname = '127.0.0.1' #设置主机名 port = 6666 #设置端口号 要确保这个端口号没有被使用,可以在cmd里面查看 addr = (hostname,port) srv = socket.socket() #创建一个socket srv.bind(addr) srv.listen(5) print("waitting connect") while True: connect_socket,client_addr = srv.accept() print(client_addr) recevent = connect_socket.recv(1024) print(str(recevent,encoding='gbk')) connect_socket.send.send(bytes("你好,数据传输完成,这里是gaby-yan--server",encoding='gbk')) connect_socket.close()
二、 客户端client的写法:
客户端的写法相对比较简单,只有
1.创建socket
2. 建立连接 connect
3. 发送 send
4. 接收recv
这是由于他们的传递编程框架不同造成的,如图。
import socket hostname = '127.0.0.1' port = 7777 addr = (hostname,port) clientsock = socket.socket() ## 创建一个socket clientsock.connect(addr) # 建立连接 say = input("输入你想传送的消息:") clientsock.send(bytes(say,encoding='gbk')) #发送消息 recvdata = clientsock.recv(1024) #接收消息 recvdata 是bytes形式的 print(str(recvdata,encoding='gbk')) # 我们看不懂bytes,所以转化为 str clientsock.close()
注意:先运行server的代码,再运行client的代码。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。