Python socket编程(1)

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()

就是将发送与接受数据结合一下。

发布了24 篇原创文章 · 获赞 2 · 访问量 417

猜你喜欢

转载自blog.csdn.net/weixin_45735361/article/details/104006720