socket程式設計各步驟作用簡述之python版

2022-08-03 00:15:15 字數 2647 閱讀 1681

python的標準庫裡面自帶了socket模組,直接可以匯入,連線方式和其它程式語言基本也是一樣的,因為初學socket程式設計所以每一步具體起到什麼作用還不是很明確,而網上基本都是直接**,大同小易;只有自己試了幾次才知道。來看一下比喻的socket連線圖:

基本上乙個程式對應乙個埠,乙個執行緒監聽乙個socket訊息。正常單執行緒時,有乙個請求連線發來,直接就是由唯一的主線程來監聽,然後傳送訊息、接收訊息,此時若有其它請求來時,則不會處理只能在請求佇列等待,當請求佇列已滿時則不會再接收請求,直接返回錯誤。當第乙個請求連線處理完事情後,呼叫了close方法把客戶端連線斷開後,才開始讀取請求佇列裡最早的請求,此時請求佇列不是滿的,將可以繼續接收請求並排隊等待被處理。

[python] view plain copy

from socket import *

from time import ctime

tcpsersock = socket(af_inet, sock_stream) #建立乙個伺服器socket物件

tcpsersock.bind(('localhost', 21567)) #設定伺服器socket物件的引數

tcpsersock.listen(5) #設定伺服器socket的請求佇列長度

while true:

print 'waiting for connection.....'

tcpclisock, addr = tcpsersock.accept() ##開始監聽伺服器socket埠,可以有多個執行緒來一起監控

print '...conneced from:', addr

while true:

data = tcpclisock.recv(1024) #接收客戶端訊息

if not data:

break

tcpclisock.send('[%s] %s' % (ctime(), data)) #向客戶端傳送訊息

tcpclisock.close() ##關閉客戶端socket的鏈結

而當不是單執行緒時,就會有多個執行緒監聽同乙個埠,當有連線來時優先順序最高的執行緒將會監聽到請求並開始處理,此時有第二個請求來時,再次有優先順序最高的執行緒來監控並處理請求,直到所有執行緒都用完了,才開始往優先順序最高的執行緒監聽佇列裡插入請求。【適用於短連線,如瀏覽器】

[python] view plain copy

#!/usr/bin/env python

#encoding: utf-8

import socket, sys, threading, ctime

server = '127.0.0.1' #主機ip

port = 8080 #埠號

maxthreads = 10

recvbuflen = 1024

class checker(threading.thread):

def __init__(self,socket,num):

threading.thread.__init__(self)

self.socket = socket

self.num = num

print 'thread started!'

def run(self):

while true:

self.socket.listen(2)

print 'waiting for connection.....'

cs,address = self.socket.accept()

print '...conneced from:', address

while true:

data = cs.recv(1024)

if not data:

break

cs.send('[%s] %s' % (ctime(), data))

cs.close()

self.socket.close()

class authserver(object):

def __init__(self):

self.socket = none

def run(self):

self.socket = socket.socket(socket.af_inet, socket.sock_stream)

self.socket.bind((server,port))

i = 0

chkerlist =

while i')

if not data:

break

tcpclisock.send(data)

data = tcpclisock.recv(1024)

if not data:

break

print data

tcpclisock.close()

總結,對於為什麼之前沒有深刻的認識這個問題,發現主要還是在對執行緒的理解有偏差,而socket的程式設計基本是離不開執行緒的,所以想編寫好socket程式,不僅要熟悉socket及網路相關的知識,還需要學習多執行緒乃至多程序的知識。

Socket程式設計步驟

我還是先了解下socket的互動過程吧,轉賬了一篇文章,給自己做個筆記 sockets 套接字 程式設計有三種,流式套接字 sock stream 資料報套接字 sock dgram 原始套接字 sock raw 基於tcp的socket程式設計是採用的流式套接字。伺服器端程式設計的步驟 1 載入套...

vc下socket程式設計步驟

vc下網路程式設計需注意 1.加上鏈結檔案ws2 32.lib 2.標頭檔案包含 winsock.h 編寫步驟如下 sockets 套接字 程式設計有三種 流式套接字 sock stream 資料報套接字 sock dgram 原始套接字 sock raw 基於tcp的socket程式設計是採用的流...

Socket程式設計步驟(筆試題)

問 socket程式設計執行send之後系統進行哪種操作?答 如果採用系統是採用阻塞模式,則系統執行send之後會等待對方返回結果才執行下一步。如果是非阻塞模式則將當前執行緒掛起,執行系統下乙個操作。問 什麼是粘包?答 出現粘包現象的原因是多方面的,它既可能由傳送方造成,也可能由接收方造成。傳送方引...