py测试一个Socket实例

本实例旨在了解py和socket的一些相关知识。php

1.服务器端搭建py监听程序。html

在客户端搭建python,linux默认自带了python2.7,先无论安装了。python

接着编写socket程序,能够在本地编辑上传,或者用vim编辑,这里用本地编辑上传,vim仍是有不方便的地方。linux

python怎么写注释?c++

在脚本里写了几行中文注释,可是,忘了py的注释格式,用的“//”出错 ,改用#号,用#号作注释,和其余c,c++,php,js,都不同,独特的风格仍是好记忆的,这里直接记下,可是改用#后仍是出错,由于py文件编辑好后,默认是用ASCII码来保存,ASCII有什么特色?他只针对了原始的数字,字母,键盘符号等有编码,中文等根本就没有编码,因此要进行编码声明,vim

在首行加上浏览器

#coding=utf-8,这样注释就有效了。服务器

下面是具体的服务端的程序,引用自廖雪峰的网站app

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000python2.7

#建立socket
import socket
import threading
import time

def tcplink(sock, addr):
  print('Accept new connection from %s:%s...' % addr)
  sock.send(b'Welcome!')
  while True:
    data = sock.recv(1024)
    time.sleep(1)
    if not data or data.decode('utf-8') == 'exit':
      break
    sock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
  print('Connection from %s:%s closed.' % addr)


s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

#因为个人客户端程序在另外一个服务器上,因此我用外网的服务器和这台服务器进行通讯时被拒绝了,起初觉得是防火墙问题,后来在防火墙里也没有找到

#相关的限制,用netstat -tlp  (t:只显示tcp链接,l:只显示正在监听的端口,p:显示程序名)发现那些80端口 ip都是*等,只有这个程序是127.0.0.1才明白,这里是指

#只监听本地ip的链接而已,因此把 127.0.0.1 改为 0.0.0.0 (表示任意ip)就能够了 

#s.bind(('127.0.0.1', 9999))

s.bind(('0.0.0.0',9999))

s.listen(5)
print('Waiting for connection...')

while True:
# 接受一个新链接:
  sock, addr = s.accept()
  # 建立新线程来处理TCP链接:
  t = threading.Thread(target=tcplink, args=(sock, addr))
  t.start()

 

2.客户端编写链接程序。

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建链接:
s.connect(('127.0.0.1', 9999))
# 接收欢迎消息:
print(s.recv(1024).decode('utf-8'))
for data in [b'Michael', b'Tracy', b'Sarah']:
  # 发送数据:
  s.send(data)
  print(s.recv(1024).decode('utf-8'))
s.send(b'exit')
s.close()

 

//利用socket请求一个网页

//理解这一块对http请求原理以及浏览器的请求方式有必定的帮助

import socket


s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)


s.connect(('www.sina.com.cn',80))

s.send('GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')

buffer=[]
while True:
  d=s.recv(1024)
  if d :
    buffer.append(d)
  else :
    break

data = b''.join(buffer)
s.close

header, html = data.split(b'\r\n\r\n', 1)

print(header.decode('utf-8'))# 把接收的数据写入文件:with open('sina.html', 'wb') as f: f.write(html)

相关文章
相关标签/搜索