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

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

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

接着编写socket程序,可以在本地编辑上传,或者用vim编辑,这里用本地编辑上传,vim还是有不方便的地方。

python怎么写注释?

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

在首行加上

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

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

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432004374523e495f640612f4b08975398796939ec3c000

#创建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)

py测试一个Socket实例的更多相关文章

  1. Web框架本质及第一个Django实例 Web框架

    Web框架本质及第一个Django实例   Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web ...

  2. Web框架本质及第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  3. WEB框架本质和第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 总的来说:Web框架的本质就是浏览 ...

  4. Django之Web框架本质及第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  5. Django学习笔记之Web框架由浅入深和第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  6. DAY15-web框架本质及第一个Django实例

    Web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 半成品自定义web框架 impor ...

  7. 将oracle冷备份恢复到另外一个数据库实例中

    因更换服务器需要将Oracle数据库转移到另外台Oracle中.说明: 1.测试环境为:windows server2003 和 oracle 10g. 2.2台服务器安装的程序目录一样,数据目录不一 ...

  8. Asp.Net MVC是否针对每次请求都重新创建一个控制器实例

    一.Asp.Net MVC是否针对每次请求都重新创建一个控制器实例 默认情况下,答案是确定的. ControllerBuilder类 ControllerBuilder.Current用户获取默认的控 ...

  9. python使用twisted搭建的一个socket服务

    服务端 # -*- coding: utf-8 -*- # @Time : 2018/9/19 21:41 # @Author : cxa # @File : tsTservTW.py # @Soft ...

随机推荐

  1. BBS论坛 home主页与个人站点主页

    五.Home主页与个人站点主页 home首页代码: # views.py视图函数部分代码def home(request): # 将数据库中的所有文章展示到主页 article_list = mode ...

  2. 在IDEA中用Gradle构建项目时使用lombok以依赖出现出错

    情景: 之情一直是使用Maven构建的项目并且导入依赖后都可以正常使用,但是在换成Gradle时出现了不论使用什么版本的lombok的依赖都会提示@Sl4j注解的log找不到,但是编辑界面是不会报错的 ...

  3. Vue.js 复选框

    demo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  4. mysqld_safe A mysqld process already exists

    最近修改mysql密码遇到mysqld_safe A mysqld process already exists问题: 解决步骤: 1:ps aux |grep mysql   查看mysql的进程. ...

  5. 【POJ3155】生活的艰辛Hard Life

    题面 Description ADN公司内部共 n个员工,员工之间可能曾经因为小事有了过节,总是闹矛盾.若员工u和员工 v有矛盾,用边(u, v)表示,共 m个矛盾.最近,ADN公司内部越来越不团结, ...

  6. ps去除元素的三种常用方法

    1.仿制图章工具,alt+鼠标左键进行选取复制区域,然后左键点击需要覆盖的区域. 2.套锁工具--选择区域--右键填充--内容识别.     3.修补工具,选中区域--拖动适配.     附带另一份较 ...

  7. 依赖背包变形(经典)——poj1155

    这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可 每个节点的容量定义为这个节点下的叶子结点个数,dp[u][j]用来表示节点u下选取j个物品的最大收益,最后从m-0查询dp[1][ ...

  8. NX二次开发-UFUN获取图层类别的信息UF_LAYER_ask_category_info

    1 NX11+VS2013 2 3 #include <uf.h> 4 #include <uf_ui.h> 5 #include <uf_layer.h> 6 7 ...

  9. C#-Api:身份证识别

    ylbtech-C#-Api:身份证识别 通过POST上传base64格式的图片内容,可识别二代身份证.驾照.行驶证.军官证.中华人民共和国往来港澳通行证.台湾居民往来大陆通行证.大陆居民往来台湾通行 ...

  10. "Access denied for user 'root@localhost' 试一下你的mysql是不是用任何密码都可以登录,如果是的话这里

    https://blog.csdn.net/light_breeze/article/details/82070222 花了三小时...竟然是因为这个