實驗目的
本文通過python實現了VMware下3臺Ubuntu16.04虛擬機的通信,編寫了一個一對多socket。實驗環境
首先,VMware下的機器之間需要能夠ping通,可以在VMware設置中將網絡設置設為橋連。server端
在設計一對多socket的server端時,有兩個不同于一對一socket的點需要考慮:
(1) 考慮到server端是一個廣播源,可以連接無上限的client(當然你也可以自己設置一個上限flag),所以需要加入一個while循環,使server一直處于被連接狀態;
(2) 每多連接一個client,server就需要多開一個線程,用于處理新連接進來的client的請求;
server段代碼如下:
#!/usr/bin/python
# -*- coding: UTF-8 -*-
from socket import *
import threading
import time
HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
class myThread (threading.Thread):
def __init__(self, threadID, name, counter):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
self.counter = counter
def run(self):
print "Starting " + self.name
print_time(self.name, self.counter, 3)
def print_time(threadName, delay, counter):
while counter:
time.sleep(delay)
print "%s: %s" % (threadName, time.ctime(time.time()))
counter -= 1
ClientConnected = 0
threads = []
while 1:
print 'waiting for connection...'
tcpClisock,addr = tcpSerSock.accept()
if 1:
print '...connected from: ',addr
ClientConnected += 1
print 'Client: ',ClientConnected
try:
temp = myThread(ClientConnected, ClientConnected, 1)//線程函數可以根據需求自己擴展
temp.start()
threads.append(temp)
except:
print "error, thread"
print "Exiting Main Thread"
- client端
client端設計比較簡單,與一對一的socket沒有什么不同,代碼如下:
from socket import *
HOST = '192.168.3.217' //填寫server端的ip地址
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST,PORT)
tcpCliSock = socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input("Client>")
if not data:
break
//根據需求擴展功能函數
tcpCliSock.close()
附:運行
先在server上運行server.py,然后在每個client上運行client.py,效果如下:
server端:
Paste_Image.png
client端:
Paste_Image.png
測試成功,完。