网络编程之socket

TCP 协议:可靠的,面向连接的协议  牺牲效率 确保安全    (支持全双工:双方都可以接收发送信号)

UDP 协议:不可靠的非连接协议  视频 音频 通话等

ARP协议:通过IP去获得Mac地址

通过IP+port(端口)就能确定唯一的pc和唯一的应用程序服务

套接字socket作用于应用层传输层之间

****************************************************************************************

【应用层】应用软件的交互层

         socket所在区域   两层之间

【传输层】TCP和UDP协议所在层

【网络层】IP协议作用范围    --------> 路由器      

【数据链路层】Mac地址范围  -------->交换机     arp协议获取IP对应的Mac地址

【物理层】网线网卡 介质范围

****************************************************************************************

套接字的简单c/s 模拟代码:

server:

 1 import socket
 2 sk=socket.socket()           #买一个手机
 3 sk.bind(('127.0.0.1',8080))    #绑定一个电话卡     接收的参数为元组
 4 sk.listen()          #监听电话
 5 
 6 conn,addres=sk.accept()     #接听电话 来电显示地址
 7 ret=conn.recv(1024)    #听对方说话内容  1024字节
 8 print(ret.decode('utf-8'))
 9 conn.send(bytes('客户端连接成功了?'.encode('utf-8')))    #回答对方
10 
11 conn.close()     #断开连接 挂电话
12 sk.close()       #关机

client:

1 import socket
2 sk=socket.socket()       #买手机
3 sk.connect(('127.0.0.1',8080))          #拨号    接收的参数为元组
4 
5 sk.send(bytes('我要连接你了,服务器'.encode('utf-8')))     #讲话
6 ret=sk.recv(1024)         #收听对方讲话
7 print(ret.decode('utf-8'))
8 sk.close()               #关机

需要注意:数据在网络传输必须为字节byte,中文传输前必须encode ,收到后必须decode解码 才能正确显示中文

必须先启动服务器,才能启动客户端去访问服务器,否则会报错

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

客户端与服务器的多次会话请求以及断开实现:

server:

 1 import socket
 2 sk=socket.socket()  #买手机
 3 sk.bind(('127.0.0.1',8080))   #绑卡
 4 sk.listen()  #监听
 5 
 6 conn,address=sk.accept()   #建立连接通道
 7 while True:
 8     ret=conn.recv(1024).decode('utf-8')
 9     print(ret)
10     if ret=='bye':
11         conn.send(b'bye')
12         break
13 
14     s_talk=input('请输入会话...')
15     conn.send(bytes(s_talk.encode('utf-8')))
16 
17 conn.close()
18 sk.close()

client:

 1 import socket
 2 sk=socket.socket()
 3 sk.connect(('127.0.0.1',8080))
 4 
 5 while True:
 6     c_talk = input('请输入会话内容')
 7     sk.send(bytes(c_talk.encode('utf-8')))
 8     ret=sk.recv(1024).decode('utf-8')
 9     print(ret)
10     if ret=='bye':
11         sk.send(b'bye')
12         break
13 
14 sk.close()

**********************************UDP协议****************************************

server:

1 import socket
2 sk=socket.socket(type=socket.SOCK_DGRAM)    #数据报文
3 sk.bind(('127.0.0.1',8080))
4 
5 msg,addr=sk.recvfrom(1024)           #接收数据
6 print(msg.decode('utf-8'))
7 sk.sendto(b'hello',addr)            #发送数据
8 
9 sk.close()     #关闭连接

client:

1 import socket
2 sk=socket.socket(type=socket.SOCK_DGRAM)
3 ip_port=('127.0.0.1',8080)
4 sk.sendto(b'hi server',ip_port)
5 ret,addr=sk.recvfrom(1024)
6 print(ret.decode('utf-8'))
7 
8 sk.close()

UDP协议不需要连接 ,但是收发数据都需要带上地址

 

posted @ 2018-07-29 21:41  青红*皂了个白  阅读(116)  评论(0编辑  收藏  举报