网络编程
基本概念
通信信息的基本结构
dest ip:目的Ip
src ip:源ip
dest port:目标端口
src port:源端口
content:信息内容
端口
在linux系统中,端口可以有65536(2**16)个,端口号0~65535
如果一个程序需要收发网络数据,就需要有端口号
知名端口
即众所周知的端口号,范围从0到1023
例如:
88端口分配给HTTP服务
21端口分配给FTP服务
socket
概念
简称“套接字”,是进程间通信的一种方式,能实现不同主机间的进程间通信
python的socket模块
import socket
socket.socket(AddressFamily, Type)
第一个参数一般使用IPv4地址,第二个则根据具体需求填写udp/tcp
使用流程:
1.创建套接字
2.使用套接字收发数据
3.关闭套接字
例:
创建一个tco socket(tcp套接字):
imoprt socket
# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 这里使用套接字的功能
# 不用的时候,关闭套接字
s.close()
创建一个udp socket(tcp套接字):
imoprt socket
# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 这里使用套接字的功能
# 不用的时候,关闭套接字
s.close()
注意:在Ubuntu中使用终端时,可能虚拟机的网络和电脑本身的ip不在一个网络下,此时可以将虚拟机的网络调整至桥接,然后在终端输入
sudo dhclient
就可以重新分配ip地址,等待一会儿即可
udp
用socket发送数据
在使用socket.sendto()发送数据时,不能传递字符串,只能传递bite格式,有两种解决方式:
1.在字符串前加“b”,如:b"哈哈哈哈"
2.使用编码转化,如string = “哈哈哈哈”, string.encode(“utf-8”)
完整例子:
import socket
def main():
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定本地端口
udp_socket.bind(("", 7890)) # 如果不绑定的话,每次发送计算机都会分配随机端口
while True:
send_data = input("请输入要发送的数据:")
# udp_socket.sendto(b"hahahah", 对方的ip以及port) b"hahahah"是将str转换成bite
# udp_socket.sendto(b"hahahah", ("192.168.33.53", 8080)) 方法一
udp_socket.sendto(send_data.encode("utf-8"), ("192.168.33.53", 8080)) # 方法二
# 关闭套接字
udp_socket.close()
if __name__ == "__main__":
main()
用socket接收数据
接收数据的关键在于确定端口号
需要使用socket.bind()方法
使用流程:
1.创建套接字
2.绑定本地自己的信息
3.接收数据
4.关闭套接字
例:
import socket
def main():
# 创建套接字
udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# 绑定一个本地信息
local_addr = ("", 7788) # 设置本地地址和端口号,ip一般不用写,默认本机
udp_socket.bind