30、网络编程

1、软件开发的架构:

  1、C/S:服务器与客户端架构,这种结构是从用户层面(或者物理层面)进行划分的。类似QQ、微信等需要安装应用的桌面应用。

  2、B/S:即Browser与服务器端架构,在浏览器上通过HTTP请求访问服务器端的资源。类似百度、知乎等需要浏览器访问能访问服务器。

2、什么是IP地址?

  1、IP地址是指互联网协议地址(internet protocal adress,又名网际协议地址),是指计算机在网络上的地址,IP地址与IP协议提供的一种统一的地址协议,它为互联网每一个网络和每一个主机分配一个逻辑地址,以此来屏蔽物理地址的差异。

  2、IP地址是一个32位的二进制数,通常被分为4个“8位二进制数”(也就是4个字节),IP地址通常用点分10进制数表示(a,b,c,d)的形式,a,b,c,d都是用0~255之间的整数。

3、端口:

  端口英文port,意思是设备与外界通讯交流的入口,网络相关的程序需要开一个端口,为的是能找到某台计算机上唯一的一个程序。

  同一台计算机、同一时间,只能有一个程序占用同一个端口。

  一般情况下,8000之后的端口能用。

4、互联网协议

  互联网协议就是计算机统一的标准,逻辑上把互联网分为四级。

    1)IP协议属于互联网osi七层协议中的哪一层?  网络层

    2)UDP与TCP协议属于互联网osi七层协议中的哪一层?传输层

    3)arp协议属于osi七层协议中的哪一层?数据链路层

4、socket协议

  socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,它是一个门面模式,他把复杂的IP/tcp协议族隐藏在socket后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

  

其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。

5、TCP与UDP

  TCP(Transmission Control Protocol)可靠的,面向连接的协议,通信效率低双全工(接收缓存和发送缓存),面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。

  UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高,(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。

6、套接字socket的应用

  server服务器端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)  #接收客户端信息
print(ret)       #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

  client客户端

import socket
sk = socket.socket()           # 创建客户套接字
sk.connect(('127.0.0.1',8898))    # 尝试连接服务器
sk.send(b'hello!')
ret = sk.recv(1024)         # 对话(发送/接收)
print(ret)
sk.close()            # 关闭客户套接字

可能会遇到的问题:

解决方法:

#加入一条socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址绑定到套接字
sk.listen()          #监听链接
conn,addr = sk.accept() #接受客户端链接
ret = conn.recv(1024)   #接收客户端信息
print(ret)              #打印客户端信息
conn.send(b'hi')        #向客户端发送信息
conn.close()       #关闭客户端套接字
sk.close()        #关闭服务器套接字(可选)

 

posted @ 2018-01-25 16:30  王二黑  阅读(155)  评论(0编辑  收藏  举报