网络通信的基本接口是socket,它扩展了操作系统的基本I/O到网络网络通信。socket可以通过socket()函数来建立,通过connect()函数来连接。得到了socket,可以确定本地和远程端点的IP地址和端口号。socket对不同的协议来说都是一种通用的接口,它可以处理TCP和UDP通信。

建立socket需要两步:建立socket对象、连接到远程服务器上

import socket
print "Creating socket"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #指明通信类型和协议家族
print "Done!" print "Connecting to remote host..."
s.connect(("www.baidu.com", 80))
print "Done"

运行结果

Creating socket
Done!
Connecting to remote host...
Done

查找端口号

通过协议名和端口名查找端口号(unix系统可以在etc/services中找到对应的端口号)

import socket
print "Creating socket"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Done!" print "Looking up port number..."
port = socket.getservbyname("http", "tcp")
print port
print "done!" print "Connecting to remote host..."
s.connect(("www.baidu.com", port))
print "Done!!"

运行结果

Creating socket
Done!
Looking up port number...
80
done!
Connecting to remote host...
Done!!

从socket获得信息

import socket
print "Creating socket"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Done!" print "Looking up port number..."
port = socket.getservbyname("http", "tcp")
print port
print "done!" print "Connecting to remote host..."
s.connect(("www.baidu.com", port))
print "Done!!" print "Connected from", s.getsockname() #获得本地机器的ip和端口号(端口号由操作系统随机分配,每次都不一样)
print "Connected to", s.getpeername() #获得连接机器的ip和端口号

一次运行结果

Creating socket
Done!
Looking up port number...
80
done!
Connecting to remote host...
Done!!
Connected from ('192.168.209.129', 56245)
Connected to ('220.181.112.244', 80)

利用socket通信

socket对象:send()、sendto()、recv()、recvfrom()

文件类对象:read()、write()、readline()

处理错误

import socket, sys

host = sys.argv[1]
textport = sys.argv[2]
filename = sys.argv[3] try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
print "Strange error creating socket: %s" % e
sys.exit(1) try:
port = int(textport)
except ValueError:
try:
port = socket.getservbyname(textport, 'tcp')
except socket.error, e:
print "Couldn't find your port: %s" % e
sys.exit(1) try:
s.connect((host, port))
except socket.gaierror, e:
print "Address-related error connecting to server: %s" %e
sys.exit(1)
except socket.error, e:
print "Connection error: %s" %e
sys.exit(1) try:
s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename)
except socket.error, e:
print "Error sending data: %s" %e
sys.exit(1)
print "---------------------------------------" while 1:
try:
buf = s.recv(2048)
except socket.error, e:
print "========Error receving data: %s=======" %e
sys.exit(1)
if not len(buf):
break
sys.stdout.write(buf)
print "---------------------------------------"

改进

#coding: utf-8
import socket
import sys
import time host = sys.argv[1]
textport = sys.argv[2]
filename = sys.argv[3] try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error, e:
print "Strange error creating socket: %s" % e
sys.exit(1) try:
port = int(textport)
except ValueError:
print "ValueError"
try:
port = socket.getservbyname(textport, 'tcp')
except socket.error, e:
print "Couldn't find your port: %s" % e
sys.exit(1) try:
s.connect((host, port))
except socket.gaierror, e: #主机名不对
print "Address-related error connecting to server: %s" %e
sys.exit(1)
except socket.error, e: #连接远程主机有问题
print "Connection error: %s" %e
sys.exit(1) print "Sleepping........."
time.sleep(10)
print "Continuing." try:
s.sendall("GET %s HTTP/1.0\r\n\r\n" % filename)
except socket.error, e:
print "Error sending data: %s" % e
sys.exit(1) try:
s.shutdown(1)
except socket.error, e:
print "Error sending data (detected by shutdown):%s" % e
sys.exit(1) print "---------------------------------------"
while 1:
try:
buf = s.recv(2048)
print "try"
except socket.error, e:
print "========Error receving data: %s=======" %e
sys.exit(1) if not len(buf): #接受的为空
print "breaK"
break
sys.stdout.write(buf)
print "---------------------------------------"

python 网络编程——客户端的更多相关文章

  1. Python 网络编程(二)

    Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...

  2. Python 网络编程(一)

    Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. ...

  3. Python学习(22)python网络编程

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  4. Day07 - Python 网络编程 Socket

    1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...

  5. python网络编程-01

    python网络编程 1.socket模块介绍 ①在网络编程中的一个基本组件就是套接字(socket),socket是两个程序之间的“信息通道”. ②套接字包括两个部分:服务器套接字.客户机套接字 ③ ...

  6. python 网络编程(Socket)

    # from wsgiref.simple_server import make_server## def RunServer(environ,start_response):# start_resp ...

  7. python 网络编程 IO多路复用之epoll

    python网络编程——IO多路复用之epoll 1.内核EPOLL模型讲解     此部分参考http://blog.csdn.net/mango_song/article/details/4264 ...

  8. Python 网络编程相关知识学习

    Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...

  9. python 网络编程 TCP/IP socket UDP

    TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...

随机推荐

  1. ORM,Entity Framework介绍以及其所包含的基础架构介绍

    一:entity framework 6.0 ORM (实体关系模型) O: Domain Object 领域模型 R: Relational Database 关系型数据库 M: Mapping 映 ...

  2. Verilog MIPS32 CPU(三)-- ALU

    Verilog MIPS32 CPU(一)-- PC寄存器 Verilog MIPS32 CPU(二)-- Regfiles Verilog MIPS32 CPU(三)-- ALU Verilog M ...

  3. c#设计模式系列:状态模式(State pattern)

    引言 我们在编程的时候,有时候会遇到,一个对象的行为动作会由对象的状态来决定的,也就是对象的行为是由状态来决定,如果对象的状态很多,那么也会由很多不同的行为,这时候我们一班会 if –else if- ...

  4. Webbench的使用

    Webbench是一个在linux下使用的非常简单的网站压测工具. 它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力 ...

  5. python excel处理

    #!/usr/bin/python # data:2018/4/20 # user:fei # -*- coding: utf-8 -*- import json import sys import ...

  6. 微信小程序遇到的问题与解决

    1.微信开发工具报错 400 (Bad Request) 解决方法: 注:因为开发工具升级 content-type的写法变了 如下代码: header:{     "Content-Typ ...

  7. django 保存订单乐观锁的使用

    后端在生成订单表的时候,牵扯到如下的知识点: 1 事物 2 高并发 3 时间函数的使用 一,事务: from django.db import transaction save_id = transa ...

  8. 自己实现一个shell

    用C实现一个简单的交互式shell,要求:当用户输入一行命令时,识别程序名和参数并调用适当的exec函数执行程序,等待执行完成后给出提示符. exec函数实际上是六种以exec开头的函数,统称exec ...

  9. [AIR] 对存储器(Storage Volume)监听

    AIR 2.0及以上提供了对系统的存储器信息访问和监听的API.通过这些API,你不仅可以访问到硬盘文件系统,同时还可以监听通过USB或火线进行连接的移动存储设备,例如移动硬盘和以存储方式连接到计算机 ...

  10. Python爬取网上车市[http://www.cheshi.com/]的数据

    #coding:utf8 #爬取网上车市[http://www.cheshi.com/]的数据 import requests, json, time, re, os, sys, time,urlli ...