一.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...