您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何進(jìn)行socket通信,內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
一、使用socket實(shí)現(xiàn)一對(duì)一的簡單通信
socket就是一個(gè)開往網(wǎng)絡(luò)應(yīng)用必備的功能模塊。通過這個(gè)模塊我們可以自己寫程序的server端和client端,可以自己定義server端對(duì)外提供服務(wù)器的ip地址和端口。學(xué)會(huì)使用這個(gè)模塊的之后我們不僅可以開往網(wǎng)絡(luò)程序,還可以利用socket模塊開發(fā)出端口掃描的程序。
先看一段創(chuàng)建服務(wù)器端的代碼
# -*- coding: utf-8 -*-
import socket
import os
#定義服務(wù)器端啟動(dòng)后要綁定的ip和端口
ip_port = ('0.0.0.0',9999)
# 創(chuàng)建socket對(duì)象并指定連接的網(wǎng)絡(luò)類型和傳輸協(xié)議
sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#綁定ip和端口號(hào)
sk.bind(ip_port)
#啟動(dòng)監(jiān)聽,并設(shè)置最多可以通知連入連接數(shù)
sk.listen(5)
#用while使程序一直運(yùn)行
while True:
#print 'server waiting...'
"""
進(jìn)入accpet阻塞狀態(tài)來等待客戶端的連接請(qǐng)求
保存客戶端的連接狀態(tài)和客戶端的地址
"""
conn,addr = sk.accept()
print addr
#如果有客戶端發(fā)來請(qǐng)求就每次都只接受1024個(gè)字節(jié)的內(nèi)容,注意recv()也是阻塞的
client_data = conn.recv(10240)
#打印從客戶端接收到的字符串
print client_data ----客戶端ip地址
#向客戶端發(fā)送字符串
conn.sendall("I`m server")
#關(guān)閉連接
conn.close()
客戶端代碼
# -*- coding: utf-8 -*-
通過以上兩段代碼的運(yùn)行,我們就實(shí)現(xiàn)了server端與client端的通信
在server端可以到如下運(yùn)行結(jié)果,接收到客戶端請(qǐng)求之后又恢復(fù)到了等待狀態(tài)
server waiting...
I`m client
server waiting...
在client端也看到了類似的結(jié)果,成功接收到了server端的發(fā)來的信息之后退出了程序
點(diǎn)擊(此處)折疊或打開
I`m server
server端改寫
# -*- coding: utf-8 -*-
import socket
import os
def save_to_txt(addr,data):
path='/tmp/'+addr+'/slow.log'
file_path = os.path.split(path)
if not os.path.exists( file_path[0] ):
os.makedirs( file_path[0] )
print '創(chuàng)建目錄成功'
if len(data)>0:
try:
with open( path.encode('utf-8'),'ab' ) as f:
data = data+"\n"
f.write( data.encode('utf-8') )
except:
print '數(shù)據(jù)插入失敗'
else:
print '沒有數(shù)據(jù)'
#定義服務(wù)器端啟動(dòng)后要綁定的ip和端口
ip_port = ('0.0.0.0',9999)
# 創(chuàng)建socket對(duì)象并指定連接的網(wǎng)絡(luò)類型和傳輸協(xié)議
sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#綁定ip和端口號(hào)
sk.bind(ip_port)
#啟動(dòng)監(jiān)聽,并設(shè)置最多可以通知連入連接數(shù)
sk.listen(5)
#用while使程序一直運(yùn)行
while True:
#print 'server waiting...'
"""
進(jìn)入accpet阻塞狀態(tài)來等待客戶端的連接請(qǐng)求
保存客戶端的連接狀態(tài)和客戶端的地址
"""
conn,addr = sk.accept()
print addr
#如果有客戶端發(fā)來請(qǐng)求就每次都只接受1024個(gè)字節(jié)的內(nèi)容,注意recv()也是阻塞的
client_data = conn.recv(10240)
#打印從客戶端接收到的字符串
print client_data
save_to_txt(addr[0],client_data) ----接送并寫入日志文件
#向客戶端發(fā)送字符串
conn.sendall("I`m server")
#關(guān)閉連接
conn.close()
client改寫
# -*- coding: utf-8 -*-
import socket
def sendtxt(line):
ip_port = ('192.168.2.136',9999)
#創(chuàng)建socket實(shí)例,參數(shù)不填的話就采用ipv4協(xié)議通過tcp傳輸
sk = socket.socket()
#發(fā)起連接到server端
sk.connect(ip_port)
#給server端發(fā)消息
sk.sendall(line)
#發(fā)送完成后接收server端的反饋
server_reply = sk.recv(10240)
#打印server端反饋的信息
print server_reply
#關(guān)閉連接
sk.close()
import fileinput
import time
import os
target_file = 'log.txt'
init_flag = True # 初次加載程序
record_count = 0
while True:
if init_flag:
#讀取整個(gè)文件
# for eachline in fileinput.input(target_file):
# print eachline
# record_count += 1
total_count = os.popen('wc -l %s' % target_file).read().split()[0]
total_count = int(total_count)
record_count = total_count
init_flag = False
else:
#如果總行數(shù)小于當(dāng)前行,那么認(rèn)為文件更新了,從第一行開始讀。
total_count = os.popen('wc -l %s' % target_file).read().split()[0]
total_count = int(total_count)
if total_count < record_count:
record_count = 0
for eachline in fileinput.input(target_file):
line_no = fileinput.filelineno()
if line_no > record_count:
if len(eachline.strip('\n')) > 0:
print eachline.strip('\n')
sendtxt(eachline.strip('\n')) --發(fā)送
record_count += 1
else:
sendtxt(' ')
record_count += 1
上述內(nèi)容就是如何進(jìn)行socket通信,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。