最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
網(wǎng)絡(luò)編程socket

楔子


你現(xiàn)在已經(jīng)學(xué)會了寫python代碼,假如你寫了兩個python文件a.py和b.py,分別去運(yùn)行,你就會發(fā)現(xiàn),這兩個python的文件分別運(yùn)行的很好。但是如果這兩個程序之間想要傳遞一個數(shù)據(jù),你要怎么做呢?


這個問題以你現(xiàn)在的知識就可以解決了,我們可以創(chuàng)建一個文件,把a(bǔ).py想要傳遞的內(nèi)容寫到文件中,然后b.py從這個文件中讀取內(nèi)容就可以了

網(wǎng)絡(luò)編程socket

創(chuàng)新互聯(lián)致力于網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作,成都網(wǎng)站設(shè)計(jì),集團(tuán)網(wǎng)站建設(shè)等服務(wù)標(biāo)準(zhǔn)化,推過標(biāo)準(zhǔn)化降低中小企業(yè)的建站的成本,并持續(xù)提升建站的定制化服務(wù)水平進(jìn)行質(zhì)量交付,讓企業(yè)網(wǎng)站從市場競爭中脫穎而出。 選擇創(chuàng)新互聯(lián),就選擇了安全、穩(wěn)定、美觀的網(wǎng)站建設(shè)服務(wù)!


但是當(dāng)你的a.py和b.py分別在不同電腦上的時候,你要怎么辦呢?

**
類似的機(jī)制有計(jì)算機(jī)網(wǎng)盤,qq等等。我們可以在我們的電腦上和別人聊天,可以在自己的電腦上向網(wǎng)盤中上傳、下載內(nèi)容。這些都是兩個程序在通信。

**

開發(fā)架構(gòu)


我們了解的涉及到兩個程序之間通訊的應(yīng)用大致可以分為兩種:


第一種是應(yīng)用類:qq、微信、網(wǎng)盤、優(yōu)酷這一類是屬于需要安裝的桌面應(yīng)用


第二種是web類:比如百度、知乎、博客園等使用瀏覽器訪問就可以直接使用的應(yīng)用


這些應(yīng)用的本質(zhì)其實(shí)都是兩個程序之間的通訊。而這兩個分類又對應(yīng)了兩個軟件開發(fā)的架構(gòu)~


  1. C/S架構(gòu)

    C/S即:Client與Server ,中文意思:客戶端與服務(wù)器端架構(gòu),這種架構(gòu)也是從用戶層面(也可以是物理層面)來劃分的。

    這里的客戶端一般泛指客戶端應(yīng)用程序EXE,程序需要先安裝 后,才能運(yùn)行在用戶的電腦上,對用戶的電腦操作系統(tǒng)環(huán)境依賴較大。

網(wǎng)絡(luò)編程socket
2.B/S架構(gòu)

B/S即:Browser與Server,中文意思:瀏覽器端與服務(wù)器端架構(gòu),這種架構(gòu)是從用戶層面來劃分的。
Browser瀏覽器,其實(shí)也是一種Client客戶端,只是這個客戶端不需要大家去安裝什么應(yīng)用程序,只需在瀏覽器上通過HTTP請求服務(wù)器端相關(guān)的資源(網(wǎng)頁資源),客戶端Browser瀏覽器就能進(jìn)行增刪改查。

網(wǎng)絡(luò)編程socket

網(wǎng)絡(luò)基礎(chǔ)

計(jì)算計(jì)網(wǎng)絡(luò)基礎(chǔ)點(diǎn)擊鏈接:https://blog.51cto.com/14068986/2318949

1.socket概念
網(wǎng)絡(luò)編程socket

理解socket

Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計(jì)模式中,Socket其實(shí)就是一個門面模式,它把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議

其實(shí)站在你的角度上看,socket就是一個模塊。我們通過調(diào)用模塊中已經(jīng)實(shí)現(xiàn)的方法建立兩個進(jìn)程之間的連接和通信。
也有人將socket說成ip+port,因?yàn)閕p是用來標(biāo)識互聯(lián)網(wǎng)中的一臺主機(jī)的位置,而port是用來標(biāo)識這臺機(jī)器上的一個應(yīng)用程序。
所以我們只要確立了ip和port就能找到一個應(yīng)用程序,并且使用socket模塊來與之通信。

2.套接字(socket)的發(fā)展史

套接字起源于 20 世紀(jì) 70 年代加利福尼亞大學(xué)伯克利分校版本的 Unix,即人們所說的 BSD Unix。 因此,有時人們也把套接字稱為“伯克利套接字”或“BSD 套接字”。一開始,套接字被設(shè)計(jì)用在同 一臺主機(jī)上多個應(yīng)用程序之間的通訊。這也被稱進(jìn)程間通訊,或 IPC。套接字有兩種(或者稱為有兩個種族),分別是基于文件型的和基于網(wǎng)絡(luò)型的。

基于文件類型的套接字家族

套接字家族的名字:AF_UNIX

unix一切皆文件,基于文件的套接字調(diào)用的就是底層的文件系統(tǒng)來取數(shù)據(jù),兩個套接字進(jìn)程運(yùn)行在同一機(jī)器,可以通過訪問同一個文件系統(tǒng)間接完成通信

基于網(wǎng)絡(luò)類型的套接字家族

套接字家族的名字:AF_INET

(還有AF_INET6被用于ipv6,還有一些其他的地址家族,不過,他們要么是只用于某個平臺,要么就是已經(jīng)被廢tcp協(xié)議和udp協(xié)議
棄,或者是很少被使用,或者是根本沒有實(shí)現(xiàn),所有地址家族中,AF_INET是使用最廣泛的一個,python支持很多種地址家族,但是由于我們只關(guān)心網(wǎng)絡(luò)編程,所以大部分時候我么只使用AF_INET)

3.tcp協(xié)議和udp協(xié)議

TCP:
(Transmission Control Protocol)可靠的、面向連接的協(xié)議(eg:打電話)、傳輸效率低全雙工通信(發(fā)送緩存&接收緩存)、面向字節(jié)流。使用TCP的應(yīng)用:Web瀏覽器;電子郵件、文件傳輸程序。

.

UDP:
(User Datagram Protocol)不可靠的、無連接的服務(wù),傳輸效率高(發(fā)送前時延小),一對一、一對多、多對一、多對多、面向報(bào)文,盡最大努力服務(wù),無擁塞控制。使用UDP的應(yīng)用:域名系統(tǒng) (DNS);視頻流;IP語音(VoIP)。

我知道說這些你們也不懂,直接上圖。

網(wǎng)絡(luò)編程socket

套接字(socket)初使用

基于TCP協(xié)議的socket
tcp是基于鏈接的,必須先啟動服務(wù)端,然后再啟動客戶端去鏈接服務(wù)端

server端

import socket
sk = socket.socket()
sk.bind(('127.0.0.1',8898))  #把地址綁定到套接字
sk.listen()          #監(jiān)聽鏈接
conn,addr = sk.accept() #接受客戶端鏈接
ret = conn.recv(1024)  #接收客戶端信息
print(ret)       #打印客戶端信息
conn.send(b'hi')        #向客戶端發(fā)送信息
conn.close()       #關(guān)閉客戶端套接字
sk.close()        #關(guān)閉服務(wù)器套接字(可選)

client端

import socket
sk = socket.socket()           # 創(chuàng)建客戶套接字
sk.connect(('127.0.0.1',8898))    # 嘗試連接服務(wù)器
sk.send(b'hello!')
ret = sk.recv(1024)         # 對話(發(fā)送/接收)
print(ret)
sk.close()            # 關(guān)閉客戶套接字

問題:有的同學(xué)在重啟服務(wù)端時可能會遇到
網(wǎng)絡(luò)編程socket

解決方法:

#加入一條socket配置,重用ip和端口
import socket
from socket import SOL_SOCKET,SO_REUSEADDR
sk = socket.socket()
sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) #就是它,在bind前加
sk.bind(('127.0.0.1',8898))  #把地址綁定到套接字
sk.listen()          #監(jiān)聽鏈接
conn,addr = sk.accept() #接受客戶端鏈接
ret = conn.recv(1024)   #接收客戶端信息
print(ret)              #打印客戶端信息
conn.send(b'hi')        #向客戶端發(fā)送信息
conn.close()       #關(guān)閉客戶端套接字
sk.close()        #關(guān)閉服務(wù)器套接字(可選)

1.基于UDP協(xié)議的socket

udp是無鏈接的,啟動服務(wù)之后可以直接接受消息,不需要提前建立鏈接
簡單使用
server端

import socket
udp_sk = socket.socket(type=socket.SOCK_DGRAM)   #創(chuàng)建一個服務(wù)器的套接字
udp_sk.bind(('127.0.0.1',9000))        #綁定服務(wù)器套接字
msg,addr = udp_sk.recvfrom(1024)
print(msg)
udp_sk.sendto(b'hi',addr)                 # 對話(接收與發(fā)送)
udp_sk.close()                         # 關(guān)閉服務(wù)器套接字

client端

import socket
ip_port=('127.0.0.1',9000)
udp_sk=socket.socket(type=socket.SOCK_DGRAM)
udp_sk.sendto(b'hello',ip_port)
back_msg,addr=udp_sk.recvfrom(1024)
print(back_msg.decode('utf-8'),addr)

<>

server

#_*_coding:utf-8_*_
import socket
ip_port=('127.0.0.1',8081)
udp_server_sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
udp_server_sock.bind(ip_port)

while True:
    qq_msg,addr=udp_server_sock.recvfrom(1024)
    print('來自[%s:%s]的一條消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],qq_msg.decode('utf-8')))
    back_msg=input('回復(fù)消息: ').strip()

    udp_server_sock.sendto(back_msg.encode('utf-8'),addr)

client

#_*_coding:utf-8_*_
import socket
BUFSIZE=1024
udp_client_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

qq_name_dic={
    '金老板':('127.0.0.1',8081),
    '哪吒':('127.0.0.1',8081),
    'egg':('127.0.0.1',8081),
    'yuan':('127.0.0.1',8081),
}

while True:
    qq_name=input('請選擇聊天對象: ').strip()
    while True:
        msg=input('請輸入消息,回車發(fā)送,輸入q結(jié)束和他的聊天: ').strip()
        if msg == 'q':break
        if not msg or not qq_name or qq_name not in qq_name_dic:continue
        udp_client_socket.sendto(msg.encode('utf-8'),qq_name_dic[qq_name])

        back_msg,addr=udp_client_socket.recvfrom(BUFSIZE)
        print('來自[%s:%s]的一條消息:\033[1;44m%s\033[0m' %(addr[0],addr[1],back_msg.decode('utf-8')))

udp_client_socket.close()

<<時間服務(wù)器>>

server

# _*_coding:utf-8_*_
from socket import *
from time import strftime

ip_port = ('127.0.0.1', 9000)
bufsize = 1024

tcp_server = socket(AF_INET, SOCK_DGRAM)
tcp_server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
tcp_server.bind(ip_port)

while True:
    msg, addr = tcp_server.recvfrom(bufsize)
    print('===>', msg)

    if not msg:
        time_fmt = '%Y-%m-%d %X'
    else:
        time_fmt = msg.decode('utf-8')
    back_msg = strftime(time_fmt)

    tcp_server.sendto(back_msg.encode('utf-8'), addr)

tcp_server.close()

client

#_*_coding:utf-8_*_
from socket import *
ip_port=('127.0.0.1',9000)
bufsize=1024

tcp_client=socket(AF_INET,SOCK_DGRAM)

while True:
    msg=input('請輸入時間格式(例%Y %m %d)>>: ').strip()
    tcp_client.sendto(msg.encode('utf-8'),ip_port)

    data=tcp_client.recv(bufsize)

socket參數(shù)的詳解

socket.socket(family=AF_INET,type=SOCK_STREAM,proto=0,fileno=None)

創(chuàng)建socket對象的參數(shù)說明:

family

地址系列應(yīng)為AF_INET(默認(rèn)值),AF_INET6,AF_UNIX,AF_CAN或AF_RDS。
(AF_UNIX 域?qū)嶋H上是使用本地 socket 文件來通信)

type:

套接字類型應(yīng)為SOCK_STREAM(默認(rèn)值),SOCK_DGRAM,SOCK_RAW或其他SOCK_常量之一。
SOCK_STREAM 是基于TCP的,有保障的(即能保證數(shù)據(jù)正確傳送到對方)面向連接的SOCKET,多用于資料傳送。
SOCK_DGRAM 是基于UDP的,無保障的面向消息的socket,多用于在網(wǎng)絡(luò)上發(fā)廣播信息。

proto

協(xié)議號通常為零,可以省略,或者在地址族為AF_CAN的情況下,協(xié)議應(yīng)為CAN_RAW或CAN_BCM之一。

fileno:

如果指定了fileno,則其他參數(shù)將被忽略,導(dǎo)致帶有指定文件描述符的套接字返回。
與socket.fromfd()不同,fileno將返回相同的套接字,而不是重復(fù)的。
這可能有助于使用socket.close()關(guān)閉一個獨(dú)立的插座。

下一篇是關(guān)于黏包現(xiàn)象,老鐵們點(diǎn)個關(guān)注。


分享題目:網(wǎng)絡(luò)編程socket
本文鏈接:http://fisionsoft.com.cn/article/gejish.html