python编程从入门,python编程基础知识
基础Python套接字编程入门课程
本文介绍了用Python对socket进行网络编程。假设读者具备网络编程和Python语法的基础知识,除非另有说明,否则本文中的所有代码都将在Python 3.4上运行。
Python的socket函数封装在socket库中。要使用套接字,请先参考官方文档,了解有关导入套接字和套接字库的详细信息。
创建套接字
首先创建一个socket,然后使用socket库中的socket函数来创建。
导入插座
#创建一个INET流套接字
s=socket.socket(socket.af_inet,socket。SOCK_STREAM).
在该示例中,创建了一个TCP套接字。socket.socket函数的前两个参数的默认值是socket。AF_INET和socket。SOCK_STREAM,它们在创建TCP套接字时被直接写成socket.socket()。
连接到服务器
使用套接字的连接功能连接到服务器。以下所有参数都有效:
s.connect()、localhost()、8000)
s.connect((127.0.0.1),8000))
s.connect((www。Baidu.com),80))
数据发送
发送数据有两种方式:send和sendall。Send不保证所有数据都已发送,但返回发送数据的长度。程序循环发送数据,直到所有数据都发送完毕。
频率差(s,msg):
总长度=长度(消息)
total_sent=0
而总计发送总计长度:
sent=s.send (msg [ total _ sent : ]
如果发送==0:
引发运行时错误(套接字连接块)。
total _ sent=已发送
Sendall确保发送所有数据,除非发送过程中出现错误。事实上,它会重复发送数据,直到所有数据都发送完毕。
在这里,我还想说一点需要特别注意的。让我们从一个例子开始:
导入插座
s=socket.socket(
s.connect((www。Baidu.com),80))
S.sendall(测试))。
都是上面的东西,没什么特别的。分别在Python 2和Python 3上运行上述代码后,结果如下。
# Python 2.7
导入插座
s=socket.socket(
s.connect((www。Baidu.com),80))
S.sendall(测试))。
在Python 2上成功执行。
# Python 3.4
导入插座
s=socket.socket(
s.connect((www。Baidu.com),80))
S.sendall(测试))。
跟踪(mostrecentcalllast):
文件中的第1行
type error:“str”doesnotsupportthebufferinterface
Python中出现异常。
即使同样的代码改变了环境,也无法执行。我是对的。愤怒的电脑。所以,你真的是对的。环境变了。请把这个结果的变化转给官方解释。
接收数据
使用recv功能接收数据:
是数据=s.recv(4096)
Python 3返回一个字节对象,Python 2返回一个字符串。请注意,函数返回的数据长度小于或等于参数指定的长度。要接收指定长度的数据,必须循环接收数据。
差分接收器(msglen):
chunks=[]
bytes_recd=0
while bytes_recd msglen:
chunk=s . recv(min(ms glen-bytes _ recd,2048))
如果chunk==b :则:
引发运行时错误(套接字连接块))。
chunks.append(chunk).
bytes_RECD=bytes_RECDlen(chunk)).
returnb“”。加入(块))).
紧密联系
如果不再需要该连接,可以使用Close关闭套接字连接。无法建立任何关闭的连接。插座回收后会自动关闭,但不要依赖这个机制。不需要的时候主动关掉插座。
计算机网络服务器
在服务器上执行程序的步骤:
1.创建服务器套接字。
1.将服务器套接字绑定到指定的地址和端口。
1.监控连接
1.接受客户端连接。
1.处理客户端数据
1.关闭客户端连接
简单回显服务器示例:
导入插座
主机=
端口=10022
s=socket.socket(socket.af_inet,socket。SOCK_STREAM).
S.bind((主机,端口))
南听着.
接受(
虽然正确:
是数据=Conn.recv(1024)
如果不是数据:
布莱克
是Conn.sendall(数据)
conn.close()
客户端程序:
导入插座
HOST=localhost
端口=10022
s=socket.socket(socket.af_inet,socket。SOCK_STREAM).
s.connect()端口,PORT))
森道尔(bHellosocket ).
DATA=s.recv(1024)).
打印(( received ,repr))数据()))))))。
s.close())
错误处理
当套接字处理过程中出现错误时,将引发异常。与插座相关的例外情况如下:
-套接字.错误
- socket.herror
- socket.gaierror
-套接字.超时
导入插座
主机=无
端口=10022
尝试:
s=socket.socket(socket.af_inet,socket。SOCK_STREAM).
S.bind((主机,端口))
南听着.
例外:socket.errorasmsg:
是打印(消息)
看完谢谢。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。