溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行socket通信

發(fā)布時(shí)間:2021-12-24 16:43:07 來源:億速云 閱讀:117 作者:柒染 欄目:互聯(lián)網(wǎng)科技

本篇文章為大家展示了如何進(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ù)器端的代碼

  1. # -*- coding: utf-8 -*-

  2. import socket

  3. import os


  4. #定義服務(wù)器端啟動(dòng)后要綁定的ip和端口

  5. ip_port = ('0.0.0.0',9999)

  6. # 創(chuàng)建socket對(duì)象并指定連接的網(wǎng)絡(luò)類型和傳輸協(xié)議

  7. sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  8. #綁定ip和端口號(hào)

  9. sk.bind(ip_port)

  10. #啟動(dòng)監(jiān)聽,并設(shè)置最多可以通知連入連接數(shù)

  11. sk.listen(5)

  12. #用while使程序一直運(yùn)行

  13. while True:

  14.     #print 'server waiting...'

  15.     """

  16.     進(jìn)入accpet阻塞狀態(tài)來等待客戶端的連接請(qǐng)求

  17.     保存客戶端的連接狀態(tài)和客戶端的地址

  18.     """

  19.     conn,addr = sk.accept()

  20.     print addr

  21.     #如果有客戶端發(fā)來請(qǐng)求就每次都只接受1024個(gè)字節(jié)的內(nèi)容,注意recv()也是阻塞的

  22.     client_data = conn.recv(10240)

  23.     #打印從客戶端接收到的字符串

  24.     print client_data                ----客戶端ip地址

  25.     #向客戶端發(fā)送字符串

  26.     conn.sendall("I`m server")

  27.     #關(guān)閉連接

  28.     conn.close()



客戶端代碼

  1. # -*- coding: utf-8 -*-

  2. import socket
    #指定server端的ip地址和端口號(hào)
    ip_port = ('127.0.0.1',9999)
    #創(chuàng)建socket實(shí)例,參數(shù)不填的話就采用ipv4協(xié)議通過tcp傳輸
    sk = socket.socket()
    #發(fā)起連接到server端
    sk.connect(ip_port)
    #給server端發(fā)消息
    sk.sendall("I`m client")
    #發(fā)送完成后接收server端的反饋
    server_reply = sk.recv(1024)
    #打印server端反饋的信息
    print server_reply
    #關(guān)閉連接
    sk.close()

通過以上兩段代碼的運(yùn)行,我們就實(shí)現(xiàn)了server端與client端的通信

在server端可以到如下運(yùn)行結(jié)果,接收到客戶端請(qǐng)求之后又恢復(fù)到了等待狀態(tài)

  1. server waiting...

  2. I`m client

  3. server waiting...

在client端也看到了類似的結(jié)果,成功接收到了server端的發(fā)來的信息之后退出了程序

點(diǎn)擊(此處)折疊或打開

  1. I`m server

拓展:實(shí)時(shí)解析客戶端的日志文件并發(fā)送至服務(wù)端保存

server端改寫

  1. # -*- coding: utf-8 -*-

  2. import socket

  3. import os


  4. def save_to_txt(addr,data):

  5.                 path='/tmp/'+addr+'/slow.log'

  6.                 file_path = os.path.split(path)

  7.                 if not os.path.exists( file_path[0] ):

  8.                         os.makedirs( file_path[0] )

  9.                         print '創(chuàng)建目錄成功'

  10.                 if len(data)>0:

  11.                         try:

  12.                                 with open( path.encode('utf-8'),'ab' ) as f:

  13.                                         data = data+"\n"

  14.                                         f.write( data.encode('utf-8') )

  15.                                         

  16.                         except:

  17.                                 print '數(shù)據(jù)插入失敗'

  18.                 else:

  19.                         print '沒有數(shù)據(jù)'



  20. #定義服務(wù)器端啟動(dòng)后要綁定的ip和端口

  21. ip_port = ('0.0.0.0',9999)

  22. # 創(chuàng)建socket對(duì)象并指定連接的網(wǎng)絡(luò)類型和傳輸協(xié)議

  23. sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  24. #綁定ip和端口號(hào)

  25. sk.bind(ip_port)

  26. #啟動(dòng)監(jiān)聽,并設(shè)置最多可以通知連入連接數(shù)

  27. sk.listen(5)

  28. #用while使程序一直運(yùn)行

  29. while True:

  30.     #print 'server waiting...'

  31.     """

  32.     進(jìn)入accpet阻塞狀態(tài)來等待客戶端的連接請(qǐng)求

  33.     保存客戶端的連接狀態(tài)和客戶端的地址

  34.     """

  35.     conn,addr = sk.accept()

  36.     print addr

  37.     #如果有客戶端發(fā)來請(qǐng)求就每次都只接受1024個(gè)字節(jié)的內(nèi)容,注意recv()也是阻塞的

  38.     client_data = conn.recv(10240)

  39.     #打印從客戶端接收到的字符串

  40.     print client_data

  41.     save_to_txt(addr[0],client_data) ----接送并寫入日志文件

  42.     #向客戶端發(fā)送字符串

  43.     conn.sendall("I`m server")

  44.     #關(guān)閉連接

  45.     conn.close()

client改寫

  1. # -*- coding: utf-8 -*-

  2. import socket

  3. def sendtxt(line):

  4.     ip_port = ('192.168.2.136',9999)

  5.     #創(chuàng)建socket實(shí)例,參數(shù)不填的話就采用ipv4協(xié)議通過tcp傳輸

  6.     sk = socket.socket()

  7.     #發(fā)起連接到server端

  8.     sk.connect(ip_port)

  9.     #給server端發(fā)消息

  10.     sk.sendall(line)

  11.     #發(fā)送完成后接收server端的反饋

  12.     server_reply = sk.recv(10240)

  13.     #打印server端反饋的信息

  14.     print server_reply

  15.     #關(guān)閉連接

  16.     sk.close()



  17. import fileinput

  18. import time

  19. import os


  20. target_file = 'log.txt'

  21. init_flag = True  # 初次加載程序


  22. record_count = 0


  23. while True:

  24.         if init_flag:

  25.             #讀取整個(gè)文件

  26.             # for eachline in fileinput.input(target_file):

  27.             #    print eachline

  28.             #    record_count += 1

  29.             total_count = os.popen('wc -l %s' % target_file).read().split()[0]

  30.             total_count = int(total_count)

  31.             record_count = total_count


  32.             init_flag = False

  33.         else:

  34.             #如果總行數(shù)小于當(dāng)前行,那么認(rèn)為文件更新了,從第一行開始讀。

  35.             total_count = os.popen('wc -l %s' % target_file).read().split()[0]

  36.             total_count = int(total_count)

  37.             if total_count < record_count:

  38.                 record_count = 0


  39.             for eachline in fileinput.input(target_file):

  40.                 line_no = fileinput.filelineno()

  41.                 if line_no > record_count:

  42.                    if len(eachline.strip('\n')) > 0:

  43.                        print eachline.strip('\n')

  44.                        sendtxt(eachline.strip('\n')) --發(fā)送

  45.                        record_count += 1

  46.                    else:

  47.                        sendtxt('        ')

  48.                        record_count += 1

上述內(nèi)容就是如何進(jìn)行socket通信,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI