Python服務器開發三:Socket

Python服務器開發三:Socket

socket是操作系統中I/O的延續,它可以使進程和機器之間的通信成為可能。socket可以看成一個標準的文件描述符。不同的是文件需要用open()函數打開,而socket用socket()

函數建立.recv()、send()函數和read()、write()函數極為相似。

TCP一般通過accept()來為每個連接的客戶端建立一個新的scoket。UDP一般只是使用一個單一的socket,完全依靠recvfrom()返回的值來判斷該往哪里發送響應。

?

客戶端:

1、建立一個socket:

//SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP,AF_INET表示IPv4
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、連接socket

連接socket需要一個tuple參數,來提供IP和端口號:

s.connect((“www.example.com”, 80))

3、

復制代碼
#!/usr/bin/env pythonimport socketprint "Creating socket...",
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "done."print "Looking up port number...",
port = socket.getservbyname('http', 'tcp')
print "done."print "Connecting to remote host on port %d..." % port,
s.connect(("www.google.com", port))
print "done."#獲取本身的IP和端口號
print "Connected from", s.getsockname()
#獲取遠程的IP和端口號
print "Connected to", s.getpeername()
復制代碼

?

文件類對象:

復制代碼
import socket, sysport = 70
host = sys.argv[1]
filename = sys.argv[2]s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, port))
fd = s.makefile('rw', 0)fd.write(filename + "\r\n")for line in fd.readlines():sys.stdout.write(line)
復制代碼

高級接口:

復制代碼
import urllib, sysf = urllib.urlopen(sys.argv[1])
while 1:buf = f.read(2048)if not len(buf):breaksys.stdout.write(buf)
復制代碼

?

?

服務器端:

1、建立一個連接:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

2、設置socket選項:

//socket 端口可立即復用
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

3、綁定socket:

s.bind((host, port))

4、監聽:

s.listen(1)

5、接受連接:

while 1:clientsock, clientaddr = s.accept()print "Got connection from", clientsock.getpeername()clientsock.close()

6、

復制代碼
#!/usr/bin/env pythonimport socket, tracebackhost = ''                               # Bind to all interfaces
port = 51423s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))
#這里設定每次最多只有一個等候處理的請求,真正的服務器會設置一個很高的數字。 s.listen(1)while 1:try:clientsock, clientaddr = s.accept()except KeyboardInterrupt:raiseexcept:traceback.print_exc()continue# Process the connectiontry:print "Got connection from", clientsock.getpeername()# Process the request hereexcept (KeyboardInterrupt, SystemExit):raiseexcept:traceback.print_exc()# Close the connectiontry:clientsock.close()except KeyboardInterrupt:raiseexcept:traceback.print_exc()
復制代碼

使用UDP:

復制代碼
#!/usr/bin/env pythonimport socket, tracebackhost = ''                               # Bind to all interfaces
port = 51423s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host, port))while 1:try:message, address = s.recvfrom(8192)print "Got data from", address# Echo it backs.sendto(message, address)except (KeyboardInterrupt, SystemExit):raiseexcept:traceback.print_exc()
復制代碼

轉載于:https://www.cnblogs.com/L-H-R-X-hehe/p/3812630.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/376856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/376856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/376856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Syntax error: Bad for loop variable解決辦法

在Ubuntu下寫的shell文件t.sh執行時出現錯誤: 1 t.sh: 6: Syntax error: Bad for loop variable 從ubuntu 6.10開始,ubuntu就將之前默認的bash shell更換成了dash shell,其表現為/bin/sh鏈接倒了/bin/dash,而不是傳統的/bin/bash&…

Linux命令常見

摘自: 常考的 21 條 Linux 命令 目錄)cd,切換路徑ls,查看文件與目錄的命令cp,用于復制文件mv,用于移動文件、目錄cat,查看文件內容find,文件搜索文件權限命令, 設置權限,-取消權限文本處理命令打包和壓縮文件命令進程相…

記一次調試

這是我最近幾個月來遇到的最棘手的一個問題:* 昨天花了4個小時找出第一層次的原因這個糾結啊,本來和老婆說好準時下班回家吃飯的,結果被這個問題拖了老久。這是一個gradle的plugin,用來resolve公司內部的dependency的,…

OSGi.NET 學習筆記 [模塊化和插件化][小結]

【目錄】-【模塊化和插件化】-【小結】 現在我們來對OSGi.NET的“模塊化和插件化”做一個小結,再次把官方的說明拿出來  1) 物理隔離:基于UIOSP開發的模塊是一個物理隔離的可單獨部署的模塊,每一個模塊擁有獨立的文件夾、類型空…

miniob :相關環境配置

How to build 參考視頻:https://www.bilibili.com/video/BV1gv411A7oA?spm_id_from333.999.0.0將代碼下載并且安裝編譯。 git clone失敗的話參考:https://blog.csdn.net/sxg0205/article/details/81412921 install cmakebuild libevent git submodul…

Fedora 20 配置

前幾天裝了fedora 20, 斷斷續續的進行了以下配置: 1. 安裝oracle java及jdk版本切換 安裝的過程很簡單,從oracle官網上下載jdk及jre的rpm包,使用rpm -ivh 安裝。但是遇到一個問題,因為fedora系統自帶了openJDK,如果安裝oracle的jd…

raft算法學習(一):角色概念以及選舉過程

Raft算法是強領導模型,集群中只能有一個領導。 下面是raft的視頻講解: raft raft的三種角色及其概念 服務器節點狀態一共有三種:領導者(Leader)、跟隨著(Follower)、候選人(Candid…

解決 FLex 4.0 Module里面Alert.show();出錯問題

TypeError: Error #1009: 無法訪問空對象引用的屬性或方法。 at mx.managers::PopUpManagerImpl/http://www.adobe.com/2006/flex/mx/internal::createModalWindow()[E:\dev\hero_private\frameworks\projects\framework\src\mx\managers\PopUpManagerImpl.as:701] at mx.manag…

datetime2 數據類型

.net的Entity Framework構建網站數據層,給一個實體的DATETIME類型的屬性賦值時 突然莫名奇妙顯示有一個類型不匹配的異常如下: System.Data.SqlClient.SqlException: 從 datetime2 數據類型到 datetime 數據類型的轉換產生一個超出范圍的值。 解決方法&a…

Yslow的A評級指南

這里測的是V2引擎,V1想拿A幾乎不可能,一個CDN測試的F就可以輕松廢了你的網站。 A評級 現在一個一個分析。 User fewer HTTP Requests:減少HTTP請求 圖片、CSS、JS、flash等這些都需要增加http請求數,減少這些元素的數量能減少響應…

jquery下 選擇器整理

jQuery 的選擇器可謂之強大無比,這里簡單地總結一下常用的元素查找方法 $("#myELement") 選擇id值等于myElement的元素,id值不能重復在文檔中只能有一個id值是myElement所以得到的是唯一的元素 $("div") 選擇所有的di…

git日常使用教程

目錄git日常使用git 基礎用法(本地)git branchgit checkoutgit mergegit rebaseHEAD ,在提交樹上移動相對引用強制修改分支位置撤銷變更整理提交記錄提交技巧Git TagsGit Describegit 基礎用法(遠程)git fetchgit pullgit push偏離的提交歷史,十分重要!&…

android一鍵分享功能不使用任何第三方sdk

在android中有自帶的一鍵分享功能,不過它會把所有帶分享的應用都找出來,如果我們只需要一些常見的分享應用,該如何做呢? 下面看我的效果圖(橫屏和豎屏自動適配): 接下來看我的調用(支…

包含EditText組件的界面中,禁止自動彈出軟鍵盤

解決方法: 1)在Manifest.xml文件中相應的activity下添加一下代碼:android:windowSoftInputMode"stateHidden"2)讓EditText失去焦點,使用EditText的clearFocus方法 例如:EditText edit(EditText)f…

gcc 編譯器使用指南

目錄安裝準備test.cpp編譯g 編譯參數-g :編譯帶調試信息的可執行文件-O[n] :開啟優化-l 和 -L :指定庫文件 | 指定庫文件路徑-I :指定頭文件搜索目錄-Wall 和 -w:打印警告信息 | 關閉警告信息-stdc11 :設置…

bug found:定義對象時

看下面代碼 class Test{ }; class Test2{public:Test2(Test *t){}};int main(){Test test();//把定義一個對象 “Test test;” 寫成 “Test test();”函數聲明了!Test2 test2(&test);//return 0;}Dev-cpp的提示信息: no matching function for c…

CMake學習使用(基于vscode)

目錄語法一些重要指令CMake常用變量CMake編譯工程編譯流程兩種構建方式實例展示參考: 基于VSCode和CMake實現C/C開發 | Linux篇 語法 基本語法格式:指令(arg1 arg2 …) 參數使用括弧括起來參數之間使用空格或者分號分開 指令是大小寫無關的&#xff0…

idhttp.post方式 調用datasnap rest 遠程方法

idhttp.get方式調用,這種比較簡單,大家都會。post方式網上卻沒有任何成功的代碼,本人也是摸索了一個上午才搞定。 分享給大家。 (1)post方式調用的遠程方法,方法名必須加“update”前綴,不加行不…

[轉]連接excel數據源時,首行包含列名稱選項在連接字符串中的設置。

關于Excel導入的HDRYES; IMEX1詳解 ProviderMicrosoft.Jet.OLEDB.4.0;Data Source111.xls;Extended Properties"Excel 8.0;HDRNO"; 其中HDRNO或YES即首行包含列名稱選項 (參數HDR的值:HDRYes,這代表第一行是標題,不做為數據使用&am…

C++多線程快速入門(一):基本常用操作

目錄case1:創建線程1 join、detachcase2:創建線程2 線程傳參 傳值或者傳引用case3:創建線程 線程傳參 functional object作為參數case4:觀察多線程程序加速計算case5:future get 獲取并發結果case6:互斥鎖…