当前位置: 首页 > news >正文

python socket编程入门(编写server实例)+send 与sendall的区别与使用方法

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方法将引发socket.error异常。

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家族,连接格式如下:

socket.connect( (host,port) )

host代表服务器主机名或IP,port代表服务器进程所绑定的端口号。如连接成功,客户就可通过套接字与服务器通信,如果连接失败,会引发socket.error异常。

3. 处理阶段,客户和服务器将通过send方法和recv方法通信。

4. 传输结束,客户通过调用socket的close方法关闭连接。

下面给个简单的例子:

server.py

from datetime import datetime
import socket

address = ('localhost', 6789)
max_size = 1000
print('Start server at {}'.format(datetime.now()))
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 = client.recv(max_size)
'''
指定最大可以接受消息长度为1000字节
'''

print("AT",datetime.now(),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 {}".format(datetime.now()))
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(address)
client.sendall(b'Hey~~~')
data = client.recv(max_size)
print("AT",datetime.now(),"some reply" , data)
client.close()

在终端运行server.py,然后运行clien.py

----------------------------------------------------------------------------------------------------------------------------------------------------------------

python socket函数中,send 与sendall的区别与使用方法

在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)

 

转载于:https://www.cnblogs.com/alan-babyblog/p/5260156.html

相关文章:

  • POJ - 1170 Shopping Offers (五维DP)
  • IE兼容问题,各类css hack代码(亲测有效)
  • 一分钟了解阿里云产品:云数据库MongoDB版
  • eclipse部署Tomcat6 : The server does not support version 3.0 of the JEE Web module specification
  • 一行代码判断是否移动端
  • 结构型模式--装饰模式
  • launch文件概述---1
  • Python 修行摘要二
  • 安卓学习UI组件-Menu-选项菜单-上下文菜单-弹出式菜单
  • PHP学习笔记(3)-Zend Studio安装和汉化
  • mode(思维,注意内存)
  • 给新手的新浪微博 SDK 集成教程【一】
  • GDC2016【全境封锁(Tom Clancy's The Division)】对为何对应Eye Tracked System,以及各种优点的演讲报告...
  • [na]wac无线控制器集中转发部署的几种情况
  • C语言中内存分配问题
  • [译]前端离线指南(上)
  • 4. 路由到控制器 - Laravel从零开始教程
  • Brief introduction of how to 'Call, Apply and Bind'
  • exif信息对照
  • Git的一些常用操作
  • iOS | NSProxy
  • js操作时间(持续更新)
  • leetcode-27. Remove Element
  • React-redux的原理以及使用
  • 大快搜索数据爬虫技术实例安装教学篇
  • 对象管理器(defineProperty)学习笔记
  • 欢迎参加第二届中国游戏开发者大会
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 浅谈web中前端模板引擎的使用
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何在 Tornado 中实现 Middleware
  • 三栏布局总结
  • 小试R空间处理新库sf
  • 你对linux中grep命令知道多少?
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • Linux权限管理(week1_day5)--技术流ken
  • ​flutter 代码混淆
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (C语言)fgets与fputs函数详解
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (十八)三元表达式和列表解析
  • (四)JPA - JQPL 实现增删改查
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • .apk文件,IIS不支持下载解决
  • .net FrameWork简介,数组,枚举
  • .NET Framework杂记
  • .NetCore 如何动态路由
  • .NET开发不可不知、不可不用的辅助类(一)