Python3.6写socket程序
Python进行Socket程序编写使用的主要模块就是 socket 模块,在这个模块中可以找到 socket()函数,该函数用于创建套接字对象。套接字也有自己的方法集,这些方法可以实现基于套接字的网络通信。
1、socket()模块函数
要创建套接字,必须使用 socket.socket()函数,它一般的语法如下。
socket(socket_family, socket_type, protocol=0)
其中,socket_family 是 AF_UNIX 或 AF_INET(如前所述),socket_type 是SOCK_STREAM或 SOCK_DGRAM(也如前所述)。protocol 通常省略,默认为 0。
所以,为了创建 TCP/IP 套接字,可以用下面的方式调用 socket.socket()。
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
同样,为了创建 UDP/IP 套接字,需要执行以下语句。
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
因为有很多 socket 模块属性,所以此时使用“from module import *”这种导入方式可以接受,不过这只是其中的一个例外。如果使用“from socket import *”,那么我们就把 socket属性引入到了命名空间中。虽然这看起来有些麻烦,但是通过这种方式将能够大大缩短代码,正如下面所示。
tcpSock = socket(AF_INET, SOCK_STREAM)
一旦有了一个套接字对象,那么使用套接字对象的方法将可以进行进一步的交互。
2、套接字对象(内置)方法
常见的套接字对象方法和属性
| 名称 | 描述 |
| 服务器套接字方法 | |
| s.bind() | 将地址(主机名、端口号对)绑定到套接字上 |
| s.listen() | 设置并启动TCP监听器 |
| s.accept() | 被动接受TCP客户端连接,一直等待指导连接到达(阻塞) |
| 客户端套接字方法 | |
| s.connect() | 主动发起TCP服务器连接 |
| s.connect_ex() | connect()的扩展版本,此时会以错误码的形式返回问题,而不是抛出一个异常 |
| 普通的套接字方法 | |
| s.recv() | 接收 TCP 消息 |
| s.recv_into() | 接收 TCP 消息到指定的缓冲区 |
| s.send() | 发送 TCP 消息 |
| s.sendall() | 完整地发送 TCP 消息 |
| s.recvfrom() | 接收 UDP 消息 |
| s.recvfrom_into() | 接收 UDP 消息到指定的缓冲区 |
| s.sendto() | 发送 UDP 消息 |
| s.shutdown() | 关闭连接 |
| s.close() | 关闭套接字 |
3、几个实例。
目前很多教材都是用的Python2.7版本,TCP和UDP部分都有点小问题。
自己分别用TCP和UDP写了时间戳的程序,用的是Python3.6版本。
TCP-Server:
# -*- coding: utf-8 -*-
from socket import *
from time import ctime HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM)#创建服务器套接字
tcpSerSock.bind(ADDR)#套接字与地址绑定
tcpSerSock.listen(5)#监听连接 while True:
print('waiting for connection...')
tcpCliSock, addr = tcpSerSock.accept()#接受客户端连接
print('...connected from:', addr) while True:
data = tcpCliSock.recv(BUFSIZ)#接收
if not data:
break
tcpCliSock.send(('[%s] %s' % (ctime(), data.decode())).encode())
#发送
tcpCliSock.close()
tcpSerSock.close()
TCP-Client:
# -*- coding: utf-8
from socket import * HOST = '127.0.0.1'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR) while True:
data = input('> ')
if not data:
break
tcpCliSock.send(data.encode())#用encode转换成bytes
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print(data.decode('utf-8'))#用decode转换成str tcpCliSock.close()
UDP-Server:
# -*- coding: utf-8 -*-
from socket import *
from time import ctime HOST = ''
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR) while True:
print('waiting for message...')
data, addr = udpSerSock.recvfrom(BUFSIZ)
udpSerSock.sendto(('[%s] %s' % (ctime(), data.decode())).encode(), addr)
print('...received from and returned to:', addr) udpSerSock.close()
UDP-Client:
# -*- coding: utf-8 -*-
from socket import * HOST = 'localhost'
PORT = 21567
BUFSIZ = 1024
ADDR = (HOST, PORT) udpCliSock = socket(AF_INET, SOCK_DGRAM) while True:
data = input('> ')
if not data:
break
udpCliSock.sendto(data.encode(), ADDR)
data, ADDR = udpCliSock.recvfrom(BUFSIZ)
if not data:
break
print(data.decode()) udpCliSock.close()
Python3.6写socket程序的更多相关文章
- 使用Code::blocks在windows下写网络程序
使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...
- Windows socket之最简单的socket程序
原文:Windows socket之最简单的socket程序 最简单的服务器的socket程序流程如下(面向连接的TCP连接 ): 1. WSAStartup(); 初始化网络库的使用. 2. soc ...
- Glue4Net简单部署基于win服务的Socket程序
smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...
- (一)你的第一个Socket程序
概述 本文通过一个最简单的Socket通信来对每一步做通俗易懂的讲解让你了解这些函数到底是干什么用的.下面的代码虽然是用Pyhton实现的,但是你要知道这些通信机制并不是Python所定义的,因为这些 ...
- 我的第一个Socket程序-SuperSocket使用入门(一)
第一次使用Socket,遇到过坑,也涨过姿势,网上关于SuperSocket的教程基本都停留在官方给的简单demo上,实际使用还是会碰到一些问题,所以准备写两篇博客,分别来介绍SuperSocket以 ...
- 一言不合就写socket的post和get请求(拼内容,然后发出去即可)
一言不合就写socket的post和get请求.写个桌面程序,利用java写get和post请求.测试成功: SocketReq.java package com.test.CipherIndex; ...
- C++写Socket——TCP篇(0)建立连接及双方传输数据
满山的红叶--飘落之时-- 最近接触了点关于用C++写socket的东西,这里总结下. 这里主要是关于TCP的,TCP的特点什么的相关介绍在我另一篇博文里,所以这里直接动手吧. 我们先在windows ...
- JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数
第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...
- PIC12F629帮我用C语言写个程序,控制三个LED亮灭
http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...
随机推荐
- 在Linux下搭建git服务器
http://www.cnblogs.com/dee0912/p/5815267.html 步骤很详细,很受用
- 转载:ffmpeg 音视频合成分割
http://blog.csdn.net/jixiuffff/article/details/5709976 当然先安装了 gentoo 下一条命令搞定 emerge ffmpeg 格式转换 (将f ...
- Java动态代理原理及其简单应用
概念 代理对象和被代理对象一般实现相同的接口,调用者与代理对象进行交互.代理的存在对于调用者来说是透明的,调用者看到的只是接口.代理对象则可以封装一些内部的处理逻辑,如访问控制.远程通信.日志.缓存等 ...
- Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配
/** 题目:Taxi Cab Scheme UVALive - 3126 最小路径覆盖解法(必须是DAG,有向无环图) = 结点数-最大匹配 链接:https://vjudge.net/proble ...
- encoding和charset的区别~
本文将简述字符集,字符编码的概念.以及在遭遇乱码时的一些常用诊断技巧 背景:字符集和编码无疑是IT菜鸟甚至是各种大神的头痛问题.当遇到纷繁复杂的字符集,各种火星文和乱码时,问题的定位往往变得非常困难. ...
- 图像jpeg压缩
图像分割 8X8 颜色空间转换RGB->YCbCr 3个8X8的矩阵 离散余弦变换:(Discrete cosine transform),简称DCT. DCT转换后的数组中第一个是一个直线数据 ...
- Oracle之完全卸载
1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 2. 开始->程序->Oracle - OraHome81->Oracle I ...
- 使用phpnow本地搭建Discuz!如何实现伪静态
用phpnow本地搭建Discuz!如何实现伪静态 因为phpnow本身就支持伪静态,那只要看下相关的设置是否正确,写个.htaccess的文件就可以了. 一.确认httpd.conf的设置 在xxx ...
- 使用JMAP dump及分析dump文件
查看整个JVM内存状态 jmap -heap [pid]要注意的是在使用CMS GC 情况下,jmap -heap的执行有可能会导致JAVA 进程挂起 查看JVM堆中对象详细占用情况jmap -his ...
- 网络通信框架Volley使用详细说明
前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用.前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍. 1.获取JSON对 ...