Python網路程式設計

2021-08-18 17:15:22 字數 4228 閱讀 5361

一.socket套接字

socket(簡稱  套接字  ) 是程序間通訊的⼀種⽅式,它與其他程序間通訊的⼀個主要不同是:它能實現不同主機間的程序間通訊,我們⽹絡上各種各樣的服務⼤多都是基於 socket 來完成通訊的。套接字可以分為兩種:   

(1)tcp套接字是面向連線的套接字,這意味著在開始通訊之前必須先建立乙個連線。

s = socket.socket(socket.af_inet,socket.sock_stream)#建立乙個tcp套接字
(2)udp套接字是無連線的套接字,也稱為資料報,即在開始通訊之前並不需要建立連線。  

s = socket.socket(socket.af_inet, socket.sock_dgram)     #建立乙個套接字

面向連線的套接字提供一種序列化的、可靠的和不重複的資料交付,而沒有記錄邊界。這基本上意味著每條訊息可以拆分成多個片段,並且每一條訊息都能夠到達目的地,然後它們將按照順序組合在一起,最後將完整的訊息傳遞給正在等待的應用程式。

反之,無連線的套接字在資料傳輸過程中無法保證它的順序性、可靠性和不重複性,並且在資料傳輸過程中還有可能出現資料丟失的情況。同時,相對於面向連線到套接字,無連線套接字的開銷更低,成本也更加低廉,通常能夠提供更好的效能。

二.**實現

1.udp

udp發資料

from socket import *

udpsocket = socket(af_inet, sock_dgram) #1. 建立套接字

sendaddr = ('192.168.1.103', 8080) #2. 準備接收⽅的位址與埠

senddata = raw_input("請輸⼊要傳送的資料:") #3. 從鍵盤獲取資料

udpsocket.sendto(senddata, sendaddr) #4. 傳送資料到指定的電腦上

udpsocket.close() #5. 關閉套接字

udp接收數

#coding=utf-8

from socket import *

udpsocket = socket(af_inet, sock_dgram) #1. 建立套接字

bindaddr = ('', 7788)                      #2. udp繫結資訊,繫結本地的相關資訊,如果⼀個⽹絡程式不繫結,則系統會隨機分配ip位址和端⼝號,ip⼀般不⽤寫,表示本機的任何⼀個ip

udpsocket.bind(bindaddr)

recvdata = udpsocket.recvfrom(1024) #3. 等待接收對⽅傳送的資料,1024表示本次接收的最⼤位元組數

print recvdata #4. 顯示接收到的資料

udpsocket.close() #5. 關閉套接字

典型例子:模擬qq完成乙個全雙工的qq聊天程式

from threading import thread

from socket import *

#1. 收資料,然後列印

def recvdata():

while true:

recvinfo = udpsocket.recvfrom(1024)

print(">>%s:%s"%(str(recvinfo[1]), recvinfo[0]))

#2. 檢測鍵盤,發資料

def senddata():

while true:

sendinfo = raw_input("<<")

udpsocket.sendto(sendinfo.encode('utf-8'), (destip, destport))

udpsocket = none

destip = ""

destport = 0

def main():

global udpsocket

global destip

global destport

destip = raw_input("對方的ip:")

destport = int(raw_input("對方的ip:"))

udpsocket = socket(af_inet, sock_dgram)

udpsocket.bind(("", 12345))

tr = thread(target=recvdata)

ts = thread(target=senddata)

tr.start()

ts.start()

tr.join()

ts.join()

if __name__ == "__main__":

main()

2.tcp

tcp server

#!/usr/bin/env python  

# -*- coding: utf-8 -*-

import socket,threading,time

def tcplink(sock, addr):

print('accept new connection from %s:%s...' % addr)

sock.send(b'welcome!')

while true:

data = sock.recv(1024)

time.sleep(1)

if not data or data.decode('utf-8') == 'exit':

break

sock.send(('hello, %s!' % data.decode('utf-8')).encode('utf-8'))

sock.close()

print('connection from %s:%s closed.' % addr)

def ttry():

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

# 監聽埠(伺服器ip與埠)

s.bind(('127.0.0.1', 9999))

s.listen(5) #進行監聽

print('waiting for connection...')

while true:

# 接受乙個新連線:

sock, addr = s.accept()

# 建立新執行緒來處理tcp連線:

t = threading.thread(target=tcplink, args=(sock, addr)) #分配乙個執行緒去處理

t.start()

time.sleep(10)

exit(0)

if __name__ == '__main__':

ttry()

tcp client

#!/usr/bin/env python  

# -*- coding: utf-8 -*-

import socket

def ttry():

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

# 建立連線:

s.connect(('127.0.0.1', 9999))

# 接收歡迎訊息:

print(s.recv(1024).decode('utf-8'))

for data in ['michael', 'tracy', 'sarah']:

# 傳送資料:

s.send(data)

print(s.recv(1024).decode('utf-8'))

s.send(b'exit')

s.close()

if __name__ == '__main__':

ttry()

(相比之下,tcp通訊需要乙個連線的過程)

python網路程式設計 TCP網路程式設計

tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...

python 網路程式設計

今天晚上學習了一下python的網路程式設計,實現了client向server傳送資料,server反饋資訊 python 3.3 版本 server from socket import class tcpserver object def init self,serverport self.se...

python網路程式設計

網路通訊是計算機之間的程序之間的通訊。tcp程式設計 tcp連線建立是雙向通道,客戶端與服務端都可以給對方傳送資料。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫服務端。建立乙個tcp的socket連線 用socket family,type 建立套接字獲得socket物件。family...