實(shí)驗(yàn)?zāi)康?br> 本文通過python實(shí)現(xiàn)了VMware下3臺(tái)Ubuntu16.04虛擬機(jī)的通信篱瞎,編寫了一個(gè)一對(duì)多socket苟呐。
實(shí)驗(yàn)環(huán)境
首先,VMware下的機(jī)器之間需要能夠ping通俐筋,可以在VMware設(shè)置中將網(wǎng)絡(luò)設(shè)置設(shè)為橋連牵素。server端
在設(shè)計(jì)一對(duì)多socket的server端時(shí),有兩個(gè)不同于一對(duì)一socket的點(diǎn)需要考慮:
(1) 考慮到server端是一個(gè)廣播源澄者,可以連接無上限的client(當(dāng)然你也可以自己設(shè)置一個(gè)上限flag)笆呆,所以需要加入一個(gè)while循環(huán),使server一直處于被連接狀態(tài)粱挡;
(2) 每多連接一個(gè)client赠幕,server就需要多開一個(gè)線程,用于處理新連接進(jìn)來的client的請(qǐng)求询筏;
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)//線程函數(shù)可以根據(jù)需求自己擴(kuò)展
temp.start()
threads.append(temp)
except:
print "error, thread"
print "Exiting Main Thread"
- client端
client端設(shè)計(jì)比較簡(jiǎn)單榕堰,與一對(duì)一的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
//根據(jù)需求擴(kuò)展功能函數(shù)
tcpCliSock.close()
附:運(yùn)行
先在server上運(yùn)行server.py嫌套,然后在每個(gè)client上運(yùn)行client.py逆屡,效果如下:
server端:
Paste_Image.png
client端:
Paste_Image.png
測(cè)試成功圾旨,完。