IP地址
目的:用来标记网络上的一台电脑
windows和Linux查看网卡信息
在命令行中输入:
Linux中 ifconfig
windows中 ipconfig
IP地址的分类:
端口
端口分类:
1.知名端口(well known ports)
80端口分配给HTTP服务
21端口分配给FTP服务
范围是从0到1023
2.动态端口
动态端口的范围是从1024-65535
socket简介
TCP/IP协议
TCP/IP协议是Transmission Control Protocol/Internet Protocol的简写,即传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议、Internet国际互联网络的基础,由网络层的IP协议和传输层的TCP协议组成。
TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。
TCP/IP协议
TCP/IP网络模型四层模型从根本上和OSI七层网络模型是一样的,只是合并了几层
socket
socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。白话说,socket就是两个节点为了互相通信,而在各自家里装的一部’电话’。
socket的使用
1.创建套接字
2.使用套接字收/发数据
3.关闭套接字
udp发送与接收程序
udp发送数据:
import socket
def main():
#创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
#发送数据
udp_socket.sendto(b'发送的数据', ('IP地址', 端口))
#关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
在导入socket库后,先创建套接字,其中AF_INET是IPv4,AF_INET6是IPv6;SOCK_DGRAM是udp,SOCK_STREAM是tcp。TCP为流式套接字 UDP为数据报套接字
如果在发送的数据前没加b,则会出现TypeError: a bytes-like object is required, not 'str’的报错,因为要发送的数据应为bytes-like对象而不是str类型对象。如果我们要发送的对象为汉字的话,我们可以send_data.encode(‘gbk’)将其编码为gbk形式
最后不能忘记关闭套接字
udp接受数据:
1 创建套接字
2 绑定本地信息(IP和端口)
3 接受数据
4 打印数据
5 关闭套接字
import socket
def main():
#创建套接字
udp_socket = socket.socket(sockct.AF_INET,socket.SOCK_DGRAM)
#绑定本地信息
bind = ('',8080) # 不写ip 表示本机的任何一个ip
udp_socket.bind(bind)
#接收数据
while True:
recv_data = udp_socket.recvfrom(1024) # 1024 表示本次接收的最大字节数
data = recv_data[0]
address = recv_data[1]
#打印数据
print('%s:%s'%(str(address), data.decode('gbk')))
#关闭套接字
udp_socket.close()
if __name__ == '__main__':
main()
上述接收到的数据recv_data为一个元组,里面的数据为接受到的信息和发信息方的地址。
udp聊天器
1.创建套接字 套接字是可以同时收发数据的
2.发送数据
3.接收数据
import socket
def send_data(udp_socket):
desc_ip = input('请输入对方的ip')
desc_port = input('请输入对方的端口')
send_data = input('请输入要发送的内容')
udp_socket.sendto(send_data.encode('gbk'), (desc_ip, desc_port))
def recv_data(udp_socket):
recv_data = udp_socket.recvfrom(1024)
print('%s:%s' % (recv_data[1], recv_data[0].decode('gbk')))
def main():
# 创建套接字 同时接收发送数据
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定
bind = ('', 8080)
udp_socket.bind(bind)
while True:
send_data(udp_socket)
recv_data(udp_socket)
udp_socket.close()
if __name__ == '__main__':
main()
就是将发送与接受数据结合一下。