Python socket通信

1.socket服务端

 1 import socket
 2 sk=socket.socket()
 3 address=('127.0.0.1',8080)
 4 sk.bind(address)
 5 sk.listen(3)
 6 conn,add=sk.accept()
 7 print(conn,add)
 8 # conn.send(bytes('约吗','utf8'))
 9 # print('发完了')
10 data=conn.recv(1024)
11 print('收到的数据为%s'%(str(data,'utf8')))
12 
13 #<socket.socket fd=460, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 4000)> ('127.0.0.1', 4000)
14 #收到的数据为我是你哥

服务端主要的步骤为:

1.1socket建立socket套接字对象(TCP协议)

1.2bind绑定服务器的IP、Port到此套接字对象(传入参数为tuple)

1.3listen监听客户端请求,参数为监听最大等待数,正在连接通信的客户端不计算在内

1.4accept阻塞进程,直到客户端请求,返回值为服务器端的协议内容和客户端的地址端口

注意:服务器的接收和发送均使用conn对象,这是由于服务器端的socket套接字匹配多个客户端无法定位区分客户端,conn中包含客户端信息

1.5send,sendall函数为发送数据函数,PY3中要求必须为bytes类型数据,可以使用bytes(data,'utf8')来进行转换

1.6recv函数为接收数据函数,PY3接收的数据为bytes类型,可以使用str(data,'utf8')来进行转换

 

2.socket客户端

 1 import socket
 2 sk=socket.socket()
 3 address=('127.0.0.1',8080)
 4 sk.connect(address)
 5 sk.send(bytes('我是你哥','utf8'))
 6 print('发完了')
 7 # data=sk.recv(1024)
 8 # print('接收到的数据为%s'%(str(data,'utf8')))
 9 
10 #发完了

2.1socket建立套接字对象

2.2connect建立到服务器地址端口的连接请求,阻塞进程直到服务器回复

注意:客户端的接收和发送均使用sk对象,这是由于客户端socket套接字匹配一个服务器,不会混乱

 

 

3.补充

3.1建立套接字参数   socket.socket()

AF_INET:服务器之间的通信ipv4

AF_INET6:服务器之间的通信ipv6

AF_UNIX:Unix不同进程间的通信

 

SOCK-STREAM :TCP

SOCK_DGRAM :UDP

 

4.实现服务器端与客户端不间断通信,可以多次回话,客户端可以断开连接二服务端断开与单个客户端的连接,仍然可以接受其他客户端的连接请求

服务器端

方案一:

 1 import socket
 2 sk=socket.socket()
 3 address=('127.0.0.1',8080)
 4 sk.bind(address)
 5 sk.listen(3)
 6 conn,add=sk.accept()
 7 print(conn,add)
 8 while True:
 9     data=conn.recv(1024)
10     print('%s'%(str(data,'utf8')))
11     if not data:
12         conn.close()
13         conn,add=sk.accept()
14         print(add)
15         continue
16     inp=input('>>>')
17     conn.send(bytes(inp,'utf8'))
18 sk.close()

方案二:

 1 import socket
 2 sk=socket.socket()
 3 address=('127.0.0.1',8080)
 4 sk.bind(address)
 5 sk.listen(3)
 6 while True:
 7     conn,add=sk.accept()
 8     print(conn,add)
 9     while True:
10         data=conn.recv(1024)
11         print('%s'%(str(data,'utf8')))
12         if not data:
13             conn.close()
14             conn,add=sk.accept()
15             print(add)
16             continue
17         inp=input('>>>')
18         conn.send(bytes(inp,'utf8'))
19 sk.close()

客户端:

 1 import socket
 2 sk=socket.socket()
 3 address=('127.0.0.1',8080)
 4 sk.connect(address)
 5 while True:
 6     inp=input('>>>')
 7     if inp=='exit':
 8         break
 9     sk.send(bytes(inp,'utf8'))
10     data=sk.recv(1024)
11     print('%s'%(str(data,'utf8')))

客户端输入"exit"则断开与服务器端的连接

当客户端以非正常方式退出(强制退出程序)时,以上代码windows服务器端会抛异常,linux不会抛出异常

优化后为:不抛出异常,继续等待其他客户端的连接

 1 import socket
 2 sk=socket.socket()
 3 address=('127.0.0.1',8080)
 4 sk.bind(address)
 5 sk.listen(3)
 6 while True:
 7     conn,add=sk.accept()
 8     print(conn,add)
 9     while True:
10         try:
11             data=conn.recv(1024)
12         except Exception:
13             break
14 
15         print('%s'%(str(data,'utf8')))
16         if not data:
17             conn.close()
18             conn,add=sk.accept()
19             print(add)
20             continue
21         inp=input('>>>')
22         conn.send(bytes(inp,'utf8'))
23 sk.close()

posted on 2018-01-20 01:14  可爱的春哥  阅读(141)  评论(0)    收藏  举报

导航