python全栈学习笔记(二十)socket套接字

                  

 

 

Socket

 

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

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用【打开】【读写】【关闭】模式来操作。socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭)

socket和file的区别:

  • file模块是针对某个指定文件进行【打开】【读写】【关闭】
  • socket模块是针对 服务器端 和 客户端Socket 进行【打开】【读写】【关闭】

 

socket(套接字)介绍:
socket让我们不用去熟悉底层的信号传输,socket会帮我们操作   

 

下面举个socket例子:

server端:

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import socket
sk_obj = socket.socket()
sk_obj.bind(("127.0.0.1",9999))
sk_obj.listen(10)
while True:
    conn,addr = sk_obj.accept()
    conn.sendall(bytes("生活就像海洋,只有意志坚强的人才能到达彼岸!",encoding="utf-8"))
    while True:
        ret_byte = conn.recv(1024)
        ret_str = str(ret_byte,encoding="utf-8")
        conn.sendall(bytes(ret_str + "goodboy",encoding="utf-8"))
    print(conn,addr)

client端:

#!/urs/bin/env python
# -*- coding:utf-8 -*-
import socket
sk = socket.socket()
sk.connect(("127.0.0.1",9999))
ret_byte = sk.recv(1024)
ret_str = str(ret_byte,encoding="utf-8")
print(ret_str)
while True:
    info = input("Please your name:")
    sk.sendall(bytes(info,encoding="utf-8"))
    info_byte = sk.recv(1024)
    print(str(info_byte,encoding="utf-8"))

先运行server端等待client端连接

client执行结果:

C:\Python35-32\python.exe E:/pycharm/untitled/info.py
生活就像海洋,只有意志坚强的人才能到达彼岸!
Please your name:lanoni
lanonigoodboy
Please your name:

 

 


server可以做条件判断,如果client发送了指定信息过来,server可以中断端这个连接,等待别的客户

 

client这边也做设置,判断特殊情况下就退出程序

 

注:send方法和sendall方法区别
send里要发送出去的内容,可能全发送完,也可能只发一部分,这个取决于系统的底层,而且send会返回发送了多少个字节,比如发送了10个byte,那么返回值就是10,而sendall实际上也是调用send,不过它还加上了for循环,如果第一次没有全部发送,接下来还会把剩下的数据继续发送,直到发送完成。

 

 

模拟ftp:

对于ftp发送文件,可能会出现一下灵,一下不灵的情况
这是因为出现了粘包的问题。
就是socket在发送数据之前会有个缓冲区,正常是先把包的大小发送给server端,但是如果把缓冲区里的数据和文件里一开始部分数据同时发送给了服务端,那就会报错。
解决方法:
在传文件前:
client端加上这句

 

server端加上这句,这样就可以避免粘包问题的出现

socketserver
socketserver的原理是每当client连接过来,server就会创建一个进程或线程,以后这个client就和这个进程交流,这个进程会自动调用handle方法

 

ThreadingTCPServer

ThreadingTCPServer实现的Soket服务器内部会为每个client创建一个 “线程”,该线程用来和客户端进行交互。

1、ThreadingTCPServer基础

使用ThreadingTCPServer:

  • 创建一个继承自 SocketServer.BaseRequestHandler 的类
  • 类中必须定义一个名称为 handle 的方法
  • 启动ThreadingTCPServer
 
 
 
 
实现方法:
1、导入socketserver模块
2、创建一个类,类名不做要求,但是必须继承socketserver和BaseRequestHandler这两个类
3、在类里创建handle方法(名称固定必须是handle),这个方法是当创建进程或线程的时候会自动调用
4、最后两行,第一行把创建的类当做参数,用来创建对象。第二行是个死循环,让server  run起来

 

posted @ 2016-07-25 13:55  爬行的龟  阅读(105)  评论(0)    收藏  举报
如有错误,欢迎指正 邮箱656521736@qq.com