1、测试环境:
宿主机系统:win10、python 3.5
虚拟机系统:win7 64位、python 3.6、Vmware WorkStation 12
2、在【虚拟网络编辑器】中不需要做任何改变,既不需要勾选【桥接模式】也不需要勾选【NAT模式】,也不需要设置【DHCP】,即可实现宿主机和虚拟机的局域网组建;
3、使宿主机作为服务端,代码如下:
importsocket
s=socket.socket()
s.bind((‘192.168.136.1‘, 1234))
s.listen(5)whileTrue:
c,addr=s.accept()
c.send(b‘Thank you for connecting‘)
c.close()
注意:
1)s.accept() 返回一个元组 (c, addr),c是一个客户端套接字,addr是一个地址,使用 c 发送数据和关闭 socket;
2)在 c.send 中使用前缀 b 将字符串转换为byte类型
4、使虚拟机作为客户端,代码如下:
importsocket
s=socket.socket()
s.connect((‘192.168.136.1‘,1234))print(s.recv(1024))
执行客户端代码后,获取字符串 b‘Thank you for connecting‘
附:python 中的 socket 原理。在 python 中的大多数网络编程都隐藏了socket模块的基本细节,不直接和套接字交互。套接字包括两个:服务端和客户端。在创建一个服务端套接字后,让它等待连接。这样它就在某个网络地址处(IP地址和一个端口号的组合)监听,直到客户端套接字连接。连接完成后,两者就可以交互了。
处理客户端套接字通常比处理服务器端套接字容易,因为服务端必须准备随时处理客户端的连接,同时还要处理多个连接,而客户端只是简单地连接,完成事务,断开连接。(为了简便,使用 socketServer 类族和 Twisted 框架来处理服务端编程)
一个套接字就是 socket 模块中的socket类的一个实例。它的实例化需要3个参数:第1个参数是地址族(默认是socket.AF_INET);第2个参数是流(socket.SOCK_STREAM,默认值)或数据报(socket.SOCK_DGRAM)套接字;第3个参数是使用的协议(默认是0,使用默认值即可)。对于一个普通的套接字,不需要提供任何参数。服务端套接字使用 bind 方法后,再调用 listen 方法去监听某个特定地址。客户端套接字使用 connect 方法连接到服务端,在 connect 方法中使用的地址与服务端在 bind 方法中的地址相同(在服务端,能实现很多功能,比如使用函数 socket.gethostname 得到当前主机名)。在这种情况下,一个地址就是一个格式为 (host, port) 的元组,其中 host 是主机名(比如 ‘192.168.136.1‘ ),port 是端口号(一个整数)。listen 方法就是一个参数,即服务端未处理的连接长度(即允许排队等待的连接数目,这些连接在禁用之前等待)。
服务端套接字开始监听后,它就可以接受客户端的连接。这个步骤使用 accept 方法来完成。这个方法会阻塞(等待)直到客户端连接,然后就返回一个格式为 (client, address) 的元组,client 是一个客户端套接字, address 是一个地址。服务端在处理完与该客户端的连接后,再次调用 accept 方法开始等待下一个连接。这个过程通常都是在一个无限循环中实现的。
套接字有两个方法:send 和 recv ,用于传输和接收数据。可以使用字符串参数调用 send 以发送数据,用一个所需的最大字节数做参数调用 recv 来接收数据。如果不能确定使用哪个数字,那么 1024 是个很好的选择。