python:socket網絡編程


 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             break
17         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             break
16         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: jyroy

import socket, time, threading, sys

def callback_send(sock):
    '''

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


def 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地址

 


關於python網絡編程的其他資料

  菜鳥教程--http://www.runoob.com/python/python-socket.html

  python官方--https://docs.python.org/3/library/socket.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM