socket 網路程式設計即c/s架構
1:硬體c/s架構(印表機)
2:軟體c/s架構——b/s架構(web服務)
socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,讓socket去組織資料,以符合指定的協議。
基於檔案型別的套接字家族
套接字家族的名字:af_unix----基於檔案
unix一切皆檔案,基於檔案的套接字呼叫的就是底層的檔案系統來取資料,兩個套接字程序執行在同一機器,可以通過訪問同乙個檔案系統間接完成通訊
基於網路型別的套接字家族
套接字家族的名字:af_inet----基於網路
(還有af_inet6被用於ipv6,還有一些其他的位址家族,不過,他們要麼是只用於某個平台,要麼就是已經被廢棄,或者是很少被使用,或者是根本沒有實現,所有位址家族中,af_inet是使用最廣泛的乙個,python支援很多種位址家族,但是由於我們只關心網路程式設計,所以大部分時候我麼只使用af_inet)
面向連線的套接字:通訊前需要先建立乙個連線。----虛擬電路/流套接字
面向連線的通訊提供序列化的,可靠的喝不重複的資料交付,而沒有記錄邊界。實現面向連線型別的主要協議是傳輸控制協議tcp,socket使用socket.sock.stream作為套接字型別。
無連線的套接字:通訊前不需要建立連線。
在資料傳輸過程中並無法保證它的順序性,可靠性和重複性。資料報儲存了記錄邊界。實現無連線型別的主要是使用者資料報協議udp,socket使用sock.dgram作為套接字型別。
面向連線套接字---模仿ssh 命令
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#created by mona on 2017/7/10
#服務端:
import
socket
import
subprocess
phone_server=socket.socket(socket.af_inet,socket.sock_stream) #
買手機phone_server.setsockopt(socket.sol_socket,socket.so_reuseaddr,1) #
就是它,在bind前加,防止伺服器斷開後埠未清除
phone_server.bind(('
127.0.0.1
',8080)) #
綁手機卡
phone_server.listen(5) #
開機print('
server run...')
while
true:
conn,client_addr=phone_server.accept() #
等**print('
客戶端:
',client_addr)
while true: #
通訊迴圈
try:
cmd=conn.recv(1024) #
收訊息 res=subprocess.popen(cmd.decode('
utf-8'),
shell=true,
stdout=subprocess.pipe,
stderr=subprocess.pipe)
stdout=res.stdout.read()
stderr=res.stderr.read()
conn.sendall(stdout+stderr)
except
exception:
break
conn.close()
#掛**
phone_server.close() #關機
#客戶端:
import
socket
client_phone =socket.socket(socket.af_inet,socket.sock_stream)
client_phone.connect((
'127.0.0.1
',8080))
while
true:
cmd = input('
>>>>:
').strip()
ifnot cmd:continue
client_phone.send(cmd.encode(
'utf-8'))
sever_msg = client_phone.recv(1024)
print(sever_msg.decode('
utf-8'))
client_phone.close()
無線連線套接字-------模仿多人聊天
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#created by mona on 2017/7/10
#服務端
import
socket
ip_port = ('
127.0.0.1
',8081)
udp_server =socket.socket(socket.af_inet,socket.sock_dgram)
udp_server.bind(ip_port)
while
true:
qq_msg,addr = udp_server.recvfrom(1024)
print('
來自[%s:%s]的一條訊息:\033[1;44m%s\033[0m
'%(addr[0],addr[1],qq_msg.decode('
utf-8
')))
back_msg = input('
回覆訊息:
').strip()
udp_server.sendto(back_msg.encode(
'utf-8
'),addr)
#客戶端1
import
socket
udp_server =socket.socket(socket.af_inet,socket.sock_dgram)
qq_name =
while
true:
qq_name_client = input('
請選擇聊天物件:
').strip()
while
true:
msg = input('
請輸入訊息,回車傳送
').strip()
if msg == '
quit
': break
ifnot msg or
not qq_name_client or qq_name_client not
in qq_name:continue
udp_server.sendto(msg.encode(
'utf-8
'),qq_name[qq_name_client])
back_msg,addr = udp_server.recvfrom(1024)
print('
來自[%s:%s]的一條訊息:\033[1;44m%s\033[0m
' % (addr[0], addr[1], back_msg.decode('
utf-8
')))
#客戶端2:
import
socket
udp_server =socket.socket(socket.af_inet, socket.sock_dgram)
qq_name =
while
true:
qq_name_client = input('
請選擇聊天物件:
').strip()
while
true:
msg = input('
請輸入訊息,回車傳送
').strip()
if msg == '
quit
': break
ifnot msg or
not qq_name_client or qq_name_client not
in qq_name: continue
udp_server.sendto(msg.encode(
'utf-8
'), qq_name[qq_name_client])
back_msg, addr = udp_server.recvfrom(1024)
print('
來自[%s:%s]的一條訊息:\033[1;44
網路程式設計 Socket程式設計
一 網路部分 1.ip 2.埠號 在網路協議中使用埠號識別主機上不同的程序,不同的埠對應於不同的服務 應用程式 3.協議 tcp二 socket部門socket通訊基本流程圖 根據socket通訊基本流程圖,總結通訊的基本步驟 伺服器端 第一步 建立乙個用於監聽連線的socket對像 第二步 用指定...
socket網路程式設計
首先認識乙個表示主機資訊的結構體 struct hostent h addrtype 這是表示主機所使用的位址型別的定義,在c語言winsock2.h標頭檔案中以 af 開頭的巨集定義就是它的值。如果使用的是ipv4,則值為 af inet 如果是ipv6,值為 af inet4 h length ...
Socket網路程式設計
socket 網路程式設計 在c free中建立乙個對話方塊工程,取名socket1,建立如下檔案結構 main.h ifndef main h define main h include bool winapi main proc hwnd hwnd,uint umsg,wparam wparam...