先看一段代码

import socket
import sys
import re def getServerContent(url):
host_ip = socket.gethostbyname(url)
with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:
s.connect((host_ip,80))
message = b"GET / HTTP/1.1\r\n\r\n"
s.sendall(message)
reply = s.recv(4096)
return reply if __name__ == "__main__":
if len(sys.argv) == 2:
url = re.compile(r"www\.\S+\.[a-z]+")
if url.match(sys.argv[1]):
s = getServerContent(sys.argv[1])
print(s)
else:
print("Please enter the correct url")
else:
print("please specify the url")

这段代码的功能是连接上一个服务器,并发送http GET.比如连接上百度后会返回

HTTP/1.1 302 Moved Temporarily
Date: Fri, 03 Feb 2017 09:55:35 GMT
Content-Type: text/html
Content-Length: 215
Connection: Keep-Alive
Location: http://www.baidu.com/search/error.html
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 3
Set-Cookie: BDSVRTM=0; path=/

可以看出来,有了socket就可以进行网络间的通讯了。

什么是socket

在一台电脑上,一个进程和另外一个进程通信有很多种方法,比如:

  1. 信号量
  2. 全局变量
  3. 消息队列

在网络中,我们知道IP可以唯一的标识一台电脑。但是在同一时刻,电脑中可能有很多进程需要使用网络,比如我浏览器打开两个网页,可能就打开了两个网络通信进程。那么两台电脑的两个进程间怎么通信呢?于是就有了套接字(socket)。指定了IP和端口(端口和PID绑定),一个socket建立,网络中两个进程就可以通讯了。

socket是对传输层协议(主要是UDP和TCP)的一个封装,连接传输层和应用层。

python中的socket

python只是简单的对操作系统(类UNIX)socket函数进行了封装,参数都是一样的。这得益于各个操作系统都采用了类UNIX一切皆文件的思想,将网络接口抽象成一个文件,最终使得接口函数都相似(open,read,write,close)

python中使用socket只需要 import socket即可

关键函数

socket.socket(socket.AF_INET,socket.SOCK_STREAM)

这里建立了一个socket,第一个参数指定使用(host,port)二维元祖来表示IP和端口号。第二个参数表示使用TCP协议。常用的还有SOCK_DGRAM表示使用UDP协议。

代码

客户端代码

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.20.195",1234))
while True:
t=input()
s.send(t.encode('utf8')) #客户端先发送信息
if t == "exit":
break
t=s.recv(1024).decode("utf8")
if t == "exit":
break
print(t)
s.close()

服务器代码

import socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("192.168.20.195",1234))
s.listen(2)
sock,addr=s.accept()
while True:
t=sock.recv(1024).decode('utf8') #服务端先接收信息
if t == "exit":
break
print(t)
t=input()
if t == "exit":
break
sock.send(t.encode('utf8'))
s.close()

上面两段代码建立了一个服务器和一个客户端互相发消息,两台电脑自此可以正常通讯了。

python socket初探的更多相关文章

  1. Python Socket 编程——聊天室示例程序

    上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和客户端的代码了解基本的 Python Socket 编程模型.本文再通过一个例子来加强一下对 Socket 编程的 ...

  2. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. 进击的Python【第一章】:Python背景初探与Python基础(一)

    Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...

  4. python socket发送魔法包网络唤醒开机.py

    python socket发送魔法包网络唤醒开机.py 现在的电脑应该都普遍支持有线网络的WOL了,支持无线网络唤醒的电脑,可能比较少. """ python socke ...

  5. Python socket编程之二:【struct.pack】&【struct.unpack】

    import struct """通过 socket 的 send 和 recv 只能传输 str 格式的数据""" "" ...

  6. Python Socket,How to Create Socket Server? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  7. Python Socket,How to Create Socket Cilent? - 网络编程实例

    文章出自:Python socket – network programming tutorial by Silver Moon 原创译文,如有版权问题请联系删除. Network programin ...

  8. Python Socket通信原理

    [Python之旅]第五篇(一):Python Socket通信原理   python Socket 通信理论 socket例子 摘要:  只要和网络服务涉及的,就离不开Socket以及Socket编 ...

  9. Python Socket单线程+阻塞模式

    Python之旅]第五篇(二):Python Socket单线程+阻塞模式 python Socket单线程 Socket阻塞模式 串行发送 摘要:  前面第五篇(一)中的一个Socket例子其实就是 ...

随机推荐

  1. HttpServlet RequestDispatcher sendredirect和forward

    Servlet的框架是由两个Java包组成:javax.servlet和javax.servlet.http. 在javax.servlet包中定义了所有的Servlet类都必须实现或扩展的的通用接口 ...

  2. python算法-插入排序

    插入排序 一.核心思想:在一个有序的数组中,通过逐一和前面的数进行比较,找到新数的位置. 例子:数组有有一个数21 插入一个3,3<21,因此结果为 3,21 再插入一个34,34>21, ...

  3. HDU-4417 Super Mario,划分树+二分!

    Super Mario 这个题也做了一天,思路是很清晰,不过二分那里写残了,然后又是无限RE.. 题意:就是查询区间不大于k的数的个数. 思路:裸划分树+二分答案.将区间长度作为二分范围.这个是重点. ...

  4. [BZOJ1589] [Usaco2008 Dec]Trick or Treat on the Farm 采集糖果(tarjan缩点 + 记忆化搜索)

    传送门 先用tarjan缩点,再记忆话搜索一下 #include <stack> #include <cstdio> #include <cstring> #inc ...

  5. 刷题总结——射箭(bzoj2732)

    题目: Description 沫沫最近在玩一个二维的射箭游戏,如下图 1 所示,这个游戏中的 x 轴在地面,第一象限中有一些竖直线段作为靶子,任意两个靶子都没有公共部分,也不会接触坐标轴.沫沫控制一 ...

  6. Django REST

    一.什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度 ...

  7. 联合权值(codevs 3728)

    Description 无向连通图 G 有 n 个点,n−1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi,每条边的长度均为 1.图上两点 (u,v) 的距离定义为 u 点到 v ...

  8. tyvj 1061 Mobile Service

    线性DP 本题的阶段很明显,就是完成了几个请求,但是信息不足以转移,我们还需要存储三个服务员的位置,但是三个人都存的话会T,我们发现在阶段 i 处,一定有一个服务员在 p[i] 处,所以我们可以只存另 ...

  9. 对象数据源objectdatasource的使用,类的编写实现查询增删改的方法

    原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  10. Codeforces Round #287 (Div. 2) E. Breaking Good [Dijkstra 最短路 优先队列]

    传送门 E. Breaking Good time limit per test 2 seconds memory limit per test 256 megabytes input standar ...