python中的socket模塊


熟悉了一下python的socket模塊,感覺還是有點好玩的,不過坑也也是不少的。

1、服務器端代碼

#!/usr/bin/env python

import socket

HOST='192.168.1.60'
PORT=55555

s = socket.socket()
s.bind((HOST,PORT))
s.listen(10)
while True:
    conn,addres = s.accept()
    conn.send('HELLO')
    while True:
        data = conn.recv(1024)
        print data,addres
        if data =='exit':
            print 'byebye'
            break
        if not data.strip():
            continue
        flag = True
        while flag:
            info = raw_input('Answer:>>')
            if info.strip():
                flag=False
        conn.sendall(' %s' % info)
    conn.close()

主要是創建一個服務端,在創建服務端的時候,主要步驟如下:

創建socket對象socket——》綁定IP地址和端口bind——》監聽listen——》得到請求accept——》接收請求recv——》發送信息send——》關閉close

2、 客戶端代碼

#!/usr/bin/env python
import socket

HOST='192.168.1.60'
PORT=55555

s = socket.socket()
s.connect((HOST,PORT))
while True:
    data = s.recv(1024)
    if  data.strip():
        print 'Replay is ',data
        flag = True
        while flag:
            kel = raw_input('Question :>>')
            print 'raw_input values : %r' % kel
            if kel.strip():
                flag=False
        s.sendall(kel)
        if kel == 'exit':
            break
s.close()

客戶端代碼就是連接服務器,接收和發送消息,具體流程如下:

創建socket對象socket——》connet連接服務器——》獲取消息recv——》發送消息send——關閉close

3、 基本方法描述

在使用socket模塊的時候,創建對象一般是使用如下的代碼:

s = socket.socket()

在使用默認值的時候,表示創建的是TCP 的socket,地址家族表示為socket.AF_INET,socket類型默認值為socket.SOCK_STREAM表示為TCP的,而UDP的為socket.SOCK_DGRAM,表示為數據包


綁定的代碼如下:

s.bind((IP,port))
注意在綁定的時候,參數只有一個表示為元組tuple,其中第一個元素為ip地址或者是hostname,第二個參數為port端口號,也就是開始監聽哪個IP地址的哪個端口


監聽的代碼如下:

s.listen(5)
其中的參數為整數,5表示阻塞五個連接,實際上,,經過測試,十幾個都沒問題,主要是阻塞式的,當有一個連接上的時候,那么其他的都不會連接上,只有在第一個推出的時候,其他的才能進行連接,開始還以為是可以同時連接五個,然后測試下,發現不行,無論是同一個服務器上還是不同的機器上,是不能同時進行連接的,也就是所謂的阻塞式。


被動接受請求的代碼如下:

conn,addres = s.accept()
返回的是一個元組,也就是在接受客戶端的連接,返回的第一個元素是一個socket對象,可以認為是客戶端的socket對象,address表示為客戶端的地址,其實這個也就使用和客戶端進行通信的。

客戶端連接服務器端的代碼如下:

s.connect((ip,port))
參數為服務器的IP地址和服務器監聽的端口。


發送消息的代碼如下:

conn.send('string is send')
conn.sendall('send')
l兩個都是用來發送消息的,區別就是sendall盡量一次發送,而send的話主要看接收能力,如果超出范圍的話,那么會進行發送兩次進行發送


接收消息的代碼如下:

conn.recv(1024)

主要方法是recv方法表示接收消息,最多接收的字節數為1024,那么多余的字符將會在下次接收的過程中進行接收。


4、運行客服端和服務端

在運行客戶端和服務端代碼之后,發現是可以交互的,也就是客戶端和服務端進行說話,就想其他的一些交流軟件一樣,注意,在上述的代碼中還存在一些bug,並不是指異常處理


在上述的代碼中,主要的思路就是如果客戶端輸入為空,那么會一直輸入,除非輸入exit,那么退出,輸入了字符之后,才會發送到服務端

如果服務端回復為空,那么會要求服務端一直輸入,輸入字符后發送給客戶端,如果客戶端退出,那么斷開連接,繼續監聽。







免責聲明!

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



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