python:socket網路程式設計

ciscopuke發表於2021-09-09

socket

  網路上的兩個程式透過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket, 又稱為“套接字”。

模組

1 import socket

 

建立套接字

1 socket.socket([family[, type[, proto]]])
  • family: 套接字家族可以使AF_UNIX或者AF_INET

  • type: 套接字型別可以根據是面向連線的還是非連線分為SOCK_STREAM(基於TCP)SOCK_DGRAM(基於UDP)

  • protocol: 一般不填預設為0.

常用函式

sk.bind(address)

  s.bind(address) 將套接字繫結到地址。address地址的格式取決於地址族。在AF_INET下,以元組(host,port)的形式表示地址。

sk.listen(backlog)

  開始監聽傳入連線。backlog指定在拒絕連線之前,可以掛起的最大連線數量。

      backlog等於5,表示核心已經接到了連線請求,但伺服器還沒有呼叫accept進行處理的連線個數最大為5
      這個值不能無限大,因為要在核心中維護連線佇列

sk.accept()

  接受連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的地址。

  接收TCP 客戶的連線(阻塞式)等待連線的到來

sk.connect(address)

  連線到address處的套接字。一般,address的格式為元組(hostname,port),如果連線出錯,返回socket.error錯誤。

sk.close()

  關閉套接字

sk.recv(bufsize[,flag])

  接受套接字的資料。資料以字串形式返回,bufsize指定最多可以接收的數量。flag提供有關訊息的其他資訊,通常可以忽略。

sk.send(string[,flag])

  將string中的資料傳送到連線的套接字。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。即:可能未將指定內容全部傳送。

 

單執行緒通訊

  該例項中,只能 client 發一句, server回一句(先啟動server,後啟動client)

server

圖片描述

 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: jyroy 4  5 import socket 6  7 if __name__ == '__main__': 8     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  #ipv4, TCP 9     sock.bind(('0.0.0.0',5000))  #元組,相當於一個引數10     sock.listen(10)   #同時保持是十個人的連線11     conn, addr = sock.accept()12     while True:13         data = conn.recv(1024)   #最多1K的資料14         print(data)15         if data == 'bye':16             break17         else:18             msg = raw_input(">>")19             conn.send(msg)20     sock.close()21     print('Bye!!')

圖片描述

 

client

圖片描述

 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: jyroy 4  5 import socket, time 6  7 if __name__ == '__main__': 8     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9     sock.connect(('localhost',5000))10     while True:11         msg = raw_input(">>")12         if msg == "bye":13             sock.send(msg)14             sock.close()15             break16         else:17             sock.send(msg)18             data = sock.recv(1024)

圖片描述

 

多執行緒通訊

  在該例項中可以自由傳送和接收資訊(先啟動server,後啟動client)

  利用threading,多執行緒進行接受訊息和傳送訊息

  callback_recv函式負責接受資訊的功能
  callback_send函式負責傳送資訊的功能

server

圖片描述

 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: jyroy 4  5 import socket, threading, sys 6  7  8 def callback_send(conn): 9     '''10 11     :param sq:12     :return:13     '''14     while True:                #為了維持持續的傳送15         msg = raw_input(">>")16         conn.send(msg)17 18 def callback_recv(conn):19     '''20 21     :param sock:22     :return:23     '''24     while True:               #為了維持持續的接收25         data = conn.recv(1024)26         print(data)27 28 if __name__ == '__main__':29     sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)30     sock.bind(('0.0.0.0',5000))  #元組,相當於一個引數31     sock.listen(10)   #同時保持是十個人的連線32     conn, addr = sock.accept()33 34     thread_send = threading.Thread(target=callback_send, args=(conn, ))35     thread_recv = threading.Thread(target=callback_recv, args=(conn, ))36 37     thread_send.start()38     thread_recv.start()39 40     sock.close()

圖片描述

 

client

圖片描述

#!/usr/bin/env python# -*- coding:utf-8 -*-# Author: jyroyimport socket, time, threading, sysdef callback_send(sock):
    '''

    :param sq:
    :return:    '''
    while True:
        msg = raw_input(">>")
        sock.send(msg)
        # if msg in ['bye', 'quit']:
        #     sock.close
        #     breakdef callback_recv(sock):
    '''

    :param sock:
    :return:    '''
    while True:
        data = sock.recv(1024)
        print(data)if __name__ == '__main__':
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.connect(('localhost',5000))

    thread_send = threading.Thread(target=callback_send, args=(sock, ))
    thread_recv = threading.Thread(target=callback_recv, args=(sock, ))

    thread_send.start()
    thread_recv.start()

    while True:
        pass
    sock.close()

圖片描述

 

效果展示

圖片描述

 

 圖片描述

 

注意

  一定要先server程式啟動,只有server在等待client之後,client才能找到server進行通訊。

  我這個只是本機的除錯,要和別人通訊時,把client程式中,把connect的ip地址,從localhost換成要通訊的ip地址

 

原文出處:https://www.cnblogs.com/jyroy/p/9785665.html  

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4369/viewspace-2815300/,如需轉載,請註明出處,否則將追究法律責任。

相關文章