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程序的更多相关文章

  1. 使用Code::blocks在windows下写网络程序

    使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创 ...

  2. Windows socket之最简单的socket程序

    原文:Windows socket之最简单的socket程序 最简单的服务器的socket程序流程如下(面向连接的TCP连接 ): 1. WSAStartup(); 初始化网络库的使用. 2. soc ...

  3. Glue4Net简单部署基于win服务的Socket程序

    smark 专注于高并发网络和大型网站架规划设计,提供.NET平台下高吞吐的网络通讯应用技术咨询和支持 Glue4Net简单部署基于win服务的Socket程序 在写一些服务应用的时候经常把要它部署到 ...

  4. (一)你的第一个Socket程序

    概述 本文通过一个最简单的Socket通信来对每一步做通俗易懂的讲解让你了解这些函数到底是干什么用的.下面的代码虽然是用Pyhton实现的,但是你要知道这些通信机制并不是Python所定义的,因为这些 ...

  5. 我的第一个Socket程序-SuperSocket使用入门(一)

    第一次使用Socket,遇到过坑,也涨过姿势,网上关于SuperSocket的教程基本都停留在官方给的简单demo上,实际使用还是会碰到一些问题,所以准备写两篇博客,分别来介绍SuperSocket以 ...

  6. 一言不合就写socket的post和get请求(拼内容,然后发出去即可)

    一言不合就写socket的post和get请求.写个桌面程序,利用java写get和post请求.测试成功: SocketReq.java package com.test.CipherIndex; ...

  7. C++写Socket——TCP篇(0)建立连接及双方传输数据

    满山的红叶--飘落之时-- 最近接触了点关于用C++写socket的东西,这里总结下. 这里主要是关于TCP的,TCP的特点什么的相关介绍在我另一篇博文里,所以这里直接动手吧. 我们先在windows ...

  8. JAVA-集合作业-已知有十六支男子足球队参加2008 北京奥运会。写一个程序,把这16 支球队随机分为4 个组。采用List集合和随机数

    第二题 已知有十六支男子足球队参加2008 北京奥运会.写一个程序,把这16 支球队随机分为4 个组.采用List集合和随机数 2008 北京奥运会男足参赛国家: 科特迪瓦,阿根廷,澳大利亚,塞尔维亚 ...

  9. PIC12F629帮我用C语言写个程序,控制三个LED亮灭

    http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控 ...

随机推荐

  1. java文件对话框操作

        完毕文件打开与保存   FileDialog : FileDialog fd = new FileDialog(this); fd.setVisible(true);//或fd.show(); ...

  2. 使用Navicat连接阿里云服务器上的MySQL数据库

    1.首先打开Navicat,文件>新建连接> 2,两张连接方法 1>常规中输入数据库的主机名,端口,用户名,密码 这种直接连就可以了 第2种方法: 常规中输入数据库的信息,主机名用l ...

  3. Java反射机制的作用?

    Java反射机制的作用? 解答:Java反射机制的作用是: 1)在运行时判断任意一个对象所属的类. 2)在运行时构造任意一个类的对象. 3)在运行时判断任意一个类所具有的成员变量和方法. 4)在运行时 ...

  4. 【BZOJ】3410: [Usaco2009 Dec]Selfish Grazing 自私的食草者(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3410 太神了.... 按末端点排序然后贪心取即可. QAQ #include <cstdio& ...

  5. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha

    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha ...

  6. (转)java Exception层次结构详解

    转自:http://www.importnew.com/14688.html 1. JAVA异常层次结构 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程 ...

  7. Canvas清屏的实现

    /** * Canvas清屏的操作 * * 參考资料: http://blog.csdn.net/lfdfhl/article/details/9076001 * */ private void cl ...

  8. js json ie不支持json

    JSON是包含在JScript 5.8中,而为了向下兼容ie8只有在文档模式是”Internet Explorer 8 Standards”的时候才使用JScripte 5.8,其他时候使用JScri ...

  9. Android版微信小代码(转)

    以下代码仅适用于Android版微信: //switchtabpos:让微信tab更贴合Android Design 如果你并不喜欢微信Android版和iOS端同用一套UI,现在有一个小方法可以实现 ...

  10. Laravel的学习网站推荐

    Laravel官网 网址是:https://www.laravel.com,里面有优质的教程和文档 只不过是英文的. Laravel学院 网址是:http://laravelacademy.org/, ...