socket 網路程式設計

2022-03-17 08:27:19 字數 4426 閱讀 4593

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