pythonsocket编程⼊门(编写server实例)+send与sendall的区
别与使⽤⽅法
send for是什么意思python 编写server的步骤:
1. 第⼀步是创建socket对象。调⽤socket构造函数。如:
socket = socket.socket( family, type )
family参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族⽤于同⼀台机器上的进程间通信。type参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)。
2. 第⼆步是将socket绑定到指定地址。这是通过socket对象的bind⽅法来实现的:
socket.bind( address )
由AF_INET所创建的套接字,address地址必须是⼀个双元素元组,格式是(host,port)。host代表主机,port代表端⼝号。如果端⼝号正在使⽤、主机名不正确或端⼝已被保留,bind⽅法将引发异常。
3. 第三步是使⽤socket套接字的listen⽅法接收连接请求。
socket.listen( backlog )
backlog指定最多允许多少个客户连接到服务器。它的值⾄少为1。收到连接请求后,这些请求需要排队,如果队列满,就拒绝请求。
4. 第四步是服务器套接字通过socket的accept⽅法等待客户请求⼀个连接。
connection, address = socket.accept()
调⽤accept⽅法时,socket会时⼊“waiting”状态。客户请求连接时,⽅法建⽴连接并返回服务器。accept⽅法返回⼀个含有两个元素的元组(connection,address)。第⼀个元素connection是新的socket对象,服务器必须通过它与客户通信;第⼆个元素 address是客户的Internet地址。
5. 第五步是处理阶段,服务器和客户端通过send和recv⽅法通信(传输数据)。服务器调⽤send,并采⽤字符串形式向客户发送信息。send ⽅法返回已发送的字符个数。服务器使⽤recv⽅法从客户接收信息。调⽤recv 时,服务器必须指定⼀个整数,它对应于可通过本次⽅法调⽤来接收的最⼤数据量。recv⽅法在接收数据时会进⼊“blocked”状态,最后返回⼀个字符串,⽤它表⽰收到的数据。如果发送的数据量超过了recv所允许的,数据会被截短。多余的数据将缓冲于接收端。以后调⽤recv时,多余
的数据会从缓冲区删除(以及⾃上次调⽤recv以来,客户可能发送的其它任何数据)。
6. 传输结束,服务器调⽤socket的close⽅法关闭连接。
python编写client的步骤:
1. 创建⼀个socket以连接服务器:socket = socket.socket( family, type )
2.使⽤socket的connect⽅法连接服务器。对于AF_INET家族,连接格式如下:
host代表服务器主机名或IP,port代表服务器进程所绑定的端⼝号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发异常。
3. 处理阶段,客户和服务器将通过send⽅法和recv⽅法通信。
4. 传输结束,客户通过调⽤socket的close⽅法关闭连接。
下⾯给个简单的例⼦:
server.py
from datetime import datetime
import socket
address = ('localhost', 6789)
max_size = 1000
print('Start server at {}'.w()))
print('Waiting for a client now !')
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
'''
socket.AF_INET表⽰创建⼀个IP套接字;socket.SOCK_STREAM 表⽰流式socket , for TCP
sock_DGRAM表⽰数据报式socket , for UDP
'''
server.bind(address)
'''
服务器必须⽤socket包中的两个⽅法来建⽴⽹络连接,
第⼀个是socket.socket,它会创建⼀个空的套接字;
第⼆个是bind会绑定(监听这个IP地址和端⼝的所有数据)到这个套接字上
'''
server.listen(5)
'''
表⽰最多可以和5个客户端连接,超过5个就会拒绝
'''
client,addr = server.accept()
'''
调⽤accept⽅法时,socket会时⼊“waiting”状态。客户请求连接时,⽅法建⽴连接并返回服务器。
accept⽅法返回⼀个含有两个元素的元组(connection,address)。
第⼀个元素connection是新的socket对象,服务器必须通过它与客户通信;
第⼆个元素 address是客户的Internet地址
'''
data = v(max_size)
'''
指定最⼤可以接受消息长度为1000字节
'''
print("AT",w(),client,"Said",data)
client.sendall(b'Are you want to talk to me')
client.close()
server.close()
client.py
import socket
from datetime import datetime
address = ('localhost',6789)
max_size =1000
print("Start the client at {}".w()))
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.sendall(b'Hey~~~')
data = v(max_size)
print("AT",w(),"some reply" , data)
client.close()
在终端运⾏server.py,然后运⾏clien.py
----------------------------------------------------------------------------------------------------------------------------------------------------------------
在python socket编程中,有两个发送TCP的函数,send()与sendall(),区别如下:
socket.send(string[, flags]) 发送TCP数据,返回发送的字节⼤⼩。这个字节长度可能少于实际要发送的数据的长度。换句话说,这个函数执⾏⼀次,并不⼀定能发送完给定的数据,可能需要重复多次才能发送完成。
例⼦:
data = "something you want to send"
while True:
len = s.send(data[len:])
if not len:
break
socket.sendall(string[, flags]) 看懂了上⾯那个,这个函数就容易明⽩了。发送完整的TCP数据,成功返回None,失败抛出异常
例⼦:
data = "something you want to send"
s.sendall(data)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论