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

python socket

作者头像
py3study
发布2020-01-19 16:30:31
5260
发布2020-01-19 16:30:31
举报
文章被收录于专栏:python3python3

1、TCP链接

TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。所以在进行TCP链接时首先要开启服务器端口。

TCP服务端一般有几个步骤:

①  sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  创建套接字,第一个参数为套接字家族AF_INET:基于网络的套接字家族;第二个参数SOCK_STREAM:基于TCP协议的通信类型。创建时不带参数默认创建基于TCP协议的网络链接。

②  sk.bind(address)   绑定本机地址与端口号,address:元组,第一个元素为本机ip地址,第二个元素为端口号。

③  sk.listen()   开始监听TCP传入链接。

④  sock, addr = sk.accept()  接收成功链接的TCP并返回元组(sock, addr),元组第一个元素为新的套接字,负责与链接成功的客户端通信,元组第二个元素为地址,包含IP,与端口号,即 addr = (ip, port)

⑤  sock.recv(bufsize)   bufsize 指定最大接收字节数,返回一个bytes对象,即字节数组。没有数据接收时线程在此堵塞

⑥  sock.send(bytes)     将bytes发送到tcp客户端,返回发送的字节数,接收和发送可以并发执行

⑦  sock.close()   将与客户端通信的套接字关闭,关闭后不能与该客户端进行通信

⑧  sk.close()  将服务端监听套接字关闭,关闭后将不能接收新的链接

 TCP客户端一般有几个步骤:

①  sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  创建套接字

②  sk.connect(("127.0.0.1", 8899))   链接客户端

③  sk.send(bytes)  将bytes发送到服务器,返回发送的字节数

④  msg = sk.recv(bufsize)     接收数据,接收和发送可以并发执行

⑤  sk.close()  关闭套接字

代码语言:javascript
复制
 1 import socket
 2 
 3 
 4 def fn(conn):
 5     msg = conn.recv(1024).decode("utf-8")
 6     print("服务端收到>>>", msg)
 7     conn.send(msg.encode("utf-8"))
 8     print("服务端发送消息到客户端>>>", msg)
 9 
10 
11 if __name__ == "__main__":
12     sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
13     sk.bind(("127.0.0.1", 8899))
14     sk.listen()
15     while True:
16         conn, addr = sk.accept()
17         print("已连接服务器-->", addr)
18         fn(conn)
19     sk.close()
20 
21 
22 # 输出结果
23 已连接服务器--> ('127.0.0.1', 55921)
24 服务端收到>>> hhh
25 服务端发送消息到客户端>>> hhh

服务端

代码语言:javascript
复制
 1 import socket
 2 
 3 sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 4 sk.connect(("127.0.0.1", 8899))
 5 msg = input()
 6 sk.send(msg.encode("utf-8"))
 7 print("客户端发送的内容>>>", msg)
 8 msg = sk.recv(1024).decode("utf-8")
 9 print("客户端收到>>>", msg)
10 sk.close()
11 
12 
13 # 输出结果
14 hhh
15 客户端发送的内容>>> hhh
16 客户端收到>>> hhh

客户端

代码语言:javascript
复制
 1 import socket
 2 from threading import Thread
 3 
 4 
 5 def fn(conn):
 6     msg = conn.recv(1024).decode("utf-8")
 7     print("服务端收到>>>", msg)
 8     conn.send(msg.encode("utf-8"))
 9     print("服务端发送消息到客户端>>>", msg)
10 
11 
12 if __name__ == "__main__":
13     sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
14     sk.bind(("127.0.0.1", 8899))
15     sk.listen()
16     while True:
17         conn, addr = sk.accept()
18         print("已连接服务器-->", addr)
19         t = Thread(target=fn, args=(conn,))
20         t.start()
21     sk.close()
22 
23 
24 # 输出结果已连接服务器--> ('127.0.0.1', 55938)
25 已连接服务器--> ('127.0.0.1', 55939)
26 已连接服务器--> ('127.0.0.1', 55940)
27 服务端收到>>> 111
28 服务端发送消息到客户端>>> 111
29 服务端收到>>> 222
30 服务端发送消息到客户端>>> 222
31 服务端收到>>> 333
32 服务端发送消息到客户端>>> 333

服务端(多线程)

 2、UDP连接

udp服务端连接步骤:

①  sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  创建套接字

②  sk.bind(addr)  绑定指定端口和地址,服务端必须绑定,不然客户端无法知道服务端的端口号。客户端可不进行绑定程序运行时随机绑定一个端口号

③  recv_msg, recv_addr = sk.recvfrom(bufsize)   接收数据,没有数据接收时线程在此堵塞

④  sk.sendto(bytes, recv_addr)   发送数据,udp每一次发送数据都需要指定地址,发送与接收可以并发执行

⑤  sk.close()  关闭socket

udp客户端连接步骤:

①  sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  创建套接字

②  sk.sendto(bytes, recv_addr)   发送数据,返回发送的字节数,udp每一次发送数据都需要指定地址,发送与接收可以并发执行

③  recv_msg, recv_addr = sk.recvfrom(bufsize)   接收数据,没有数据接收时线程在此堵塞

④  sk.close()  关闭socket

代码语言:javascript
复制
 1 import socket
 2 
 3 print("-----server------")
 4 
 5 addr = ("127.0.0.1", 8899)
 6 sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 7 sk.bind(addr)
 8 
 9 recv_msg, recv_addr = sk.recvfrom(1024)
10 print("服务端收到>>>", recv_msg.decode("utf-8"), recv_addr)
11 msg = "AAA"
12 sk.sendto(msg.encode("utf-8"), recv_addr)
13 print("服务端发送>>>", msg)
14 
15 sk.close()
16 
17 
18 # 输出结果
19 -----server------
20 服务端收到>>> BBB ('127.0.0.1', 55802)
21 服务端发送>>> AAA

UDP server

代码语言:javascript
复制
 1 import socket
 2 
 3 print("-----client------")
 4 
 5 server_addr = ("127.0.0.1", 8899)
 6 sk = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
 7 
 8 msg = "BBB"
 9 sk.sendto(msg.encode("utf-8"), server_addr)
10 print("客户端发送>>>", msg)
11 recv_msg, recv_addr = sk.recvfrom(1024)
12 
13 print("客户端发送>>>", recv_msg.decode("utf-8"), recv_addr)
14 
15 sk.close()
16 
17 
18 # 输出结果
19 -----client------
20 客户端发送>>> BBB
21 客户端发送>>> AAA ('127.0.0.1', 8899)

UDP client

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-03-16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

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