先看一段代码

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

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

最新文章

  1. ASP.NET 操作Cookie详解 增加,修改,删除
  2. Struts(七):action配置文件之通配符映射
  3. jquery 获得多选框的值
  4. PHP 开发 APP 接口 学习笔记与总结 - APP 接口实例 [6] 版本升级接口开发
  5. JMeter使用指南--转
  6. Http网络通信--网络图片查看
  7. JAVA的instanceOf什么时候用啊
  8. 老oj3999孤独一生
  9. 在QT中使用Irrlicht引擎的方法与步骤
  10. Xcode-5.1.1更改文件盯作者
  11. Bootstrap实现弹出框和提示框效果代码
  12. C# Ioc ASP.NET MVC Dependency Injection
  13. 处理springMvc中responsebody返回中文乱码
  14. lcr电桥浅谈
  15. Nexus 3 搭建 npm 私服 (windows)
  16. Imbalanced Array CodeForces - 817D (思维+单调栈)
  17. [c/c++] programming之路(2)、kill QQ,弹出系统对话框,吃内存等
  18. 一个先进的App框架:使用Ionic创建一个简单的APP
  19. Spring-Mybatis --- 配置SqlSessionFactoryBean,整合Spring-Mybatis
  20. tensoflow学习入门一

热门文章

  1. SpringMVC之HandlerMapping源码分析
  2. jmeter历史版本下载
  3. ZingChart 图表插件
  4. BNUOJ 19297 Code Refactoring
  5. TOJ 4475: The Coolest Sub-matrix
  6. 九度oj 题目1151:位操作练习
  7. Python unittest 学习
  8. bzoj 2017 [Usaco2009 Nov]硬币游戏 动态规划
  9. __new__ 与 __init__的区别
  10. Android Studio升级到3.0,抛出Aapt2Exception异常