网络编程笔记-day1

网络通信

TCP/IP协议(族)

示例
* 链路层(物理层,数据链路层),网络层,传输层,应用层 (会话层,表示层,应用层)

网际层 = 网络层
链路层 = 网络接口层

端口 port

为TCP协议通信提供服务的端口

  1. 端口号:端口通过端口号标记。 0 - 65535
  2. 端口号的分配:
    2.1 知名端口 0 - 1023
    2.2 动态端口 0 -65535

80:HTTP
21:FTP

IP地址

IP地址被用来给Internet上的电脑一个编号。

分类
  1. A,B,C,D,E五类:
    ip地址分类
    pic

  2. 私有IP:
    局域网使用,范围:

10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255

子网掩码

用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。
作用: 将某个IP地址划分成网络地址和主机地址两部分。

百科传送门

Socket

创建socket

使用socket模块:
socket.socket(AddressFamily, Type)
* Address Family:(实际⼯作常⽤AF_INET)
* AF_INET ⽤于Internet进程间通信
* AF_UNIX ⽤于同⼀台机器进程间通信
* Type:套接字类型
* SOCK_STREAM 流式套接字,主要⽤于TCP协议
* SOCK_DGRAM 数据报套接字,主要⽤于UDP协议)

创建一个TCP套接字:

import socket  
`s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

创建一个UDP套接字:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

UDP

UDP: 用户数据报协议

udp网络程序-发送数据

创建udp客户端流程具体步骤:
1. 创建客户端套接字。
2. 发送/接收数据。
3. 关闭套接字。

示例:

#coding=utf-8
from socket import *
#1.创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2.准备接收⽅的地址
sendAddr = ('192.168.1.103', 8080)
#3.从键盘获取数据
sendData = raw_input("请输⼊要发送的数据:")
#4.发送数据到指定的电脑上
udpSocket.sendto(sendData, sendAddr)
#5.关闭套接字
udpSocket.close()
udp网络程序-接收数据
#coding=utf-8
from socket import *
#1.创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2.准备接收⽅的地址
sendAddr = ('192.168.1.103', 8080)
#3.从键盘获取数据
sendData = raw_input("请输⼊要发送的数据:")
#4.发送数据到指定的电脑上
udpSocket.sendto(sendData, sendAddr)
#5.等待接收对⽅发送的数据
recvData = udpSocket.recvfrom(1024) # 1024表示本次接收的最⼤字节数
#6.显示对⽅发送的数据
print(recvData)
#7.关闭套接字
udpSocket.close()
端口绑定
bindAddr = ('',7788)udpSocket.bind(bindAddr) #ip地址和端⼝号,ip⼀般不⽤写,表示本机的任何⼀个ip
recvData = udpSocket.recvfrom(1024) #1024表示本次接收的最⼤字节数
  • ⼀个udp⽹络程序,可以不绑定,此时操作系统会随机进⾏分配⼀个端⼝,如果重新运⾏次程序端⼝可能会发⽣变化
  • ⼀个udp⽹络程序,也可以绑定信息(ip地址,端⼝号),如果绑定成功,那么操作系统⽤这个端⼝号来进⾏区别收到的⽹络数据是否是此进程的

python2和python3在使用socket的区别

python2中:
udpSocket = sendto("haha",("192.168.111.111"),8080)

python3中:
* 需要加类型b
udpSocket = sendto("haha",(b"192.168.111.111"),8080)
* 输入数据需要编码:
udpSocket.sendto(sendData.encode("utf-8"),(destIP,destPort))

编码与解码

encode("utf-8")
decode("utf-8")
其中"gb2312"为计算机通用

示例代码:(网络调试助手)

from socket import *
udpSocket = socket(AF_INET, SOCK_DGRAM)
udpSocket.bind(("",7799))
recvData = udpSocket.recvfrom(1024)
content,destInfo = recvData
print("ontent is %s" %content.decode("gb2312"))

全双工,半双工,单工

  • 单工:
    数据传输只支持数据在一个方向上传输
  • 半双工:
    数据传输允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信
  • 全双工:
    数据通信允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。

echo服务器

接收到数据后再发回去

recvData = udpSoket.recvfrom(1024)
# 将数据发回去:
udpSocket.sendto(recvData[0],recvData[1])

猜你喜欢

转载自blog.csdn.net/OldDrivre/article/details/81812477