python 网络编程——客户端
python 网络编程——客户端
网络通信的基本接口是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"
运行结果
1
2
3
4
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!!"
运行结果
1
2
3
4
5
6
7
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和端口号
一次运行结果
1
2
3
4
5
6
7
8
9
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 "---------------------------------------"
评论关闭