【Python】socket通信

本文介绍了一对一简单Socket通信原理及实现方法,包括服务器端与客户端的建立连接、数据收发等核心过程。此外,还提供了实时解析客户端日志文件并发送至服务器端保存的示例代码。

一、使用socket实现一对一的简单通信  

socket就是一个开往网络应用必备的功能模块。通过这个模块我们可以自己写程序的server端和client端,可以自己定义server端对外提供服务器的ip地址和端口。学会使用这个模块的之后我们不仅可以开往网络程序,还可以利用socket模块开发出端口扫描的程序。

先看一段创建服务器端的代码


  1. # -*- coding: utf-8 -*-
  2. import socket
  3. import os

  4. #定义服务器端启动后要绑定的ip和端口
  5. ip_port = ('0.0.0.0',9999)
  6. # 创建socket对象并指定连接的网络类型和传输协议
  7. sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  8. #绑定ip和端口号
  9. sk.bind(ip_port)
  10. #启动监听,并设置最多可以通知连入连接数
  11. sk.listen(5)
  12. #用while使程序一直运行
  13. while True:
  14.     #print 'server waiting...'
  15.     """
  16.     进入accpet阻塞状态来等待客户端的连接请求
  17.     保存客户端的连接状态和客户端的地址
  18.     """
  19.     conn,addr = sk.accept()
  20.     print addr
  21.     #如果有客户端发来请求就每次都只接受1024个字节的内容,注意recv()也是阻塞的
  22.     client_data = conn.recv(10240)
  23.     #打印从客户端接收到的字符串
  24.     print client_data                ----客户端ip地址
  25.     #向客户端发送字符串
  26.     conn.sendall("I`m server")
  27.     #关闭连接
  28.     conn.close()


客户端代码
  1. # -*- coding: utf-8 -*-
  2. import socket
    #指定server端的ip地址和端口号
    ip_port = ('127.0.0.1',9999)
    #创建socket实例,参数不填的话就采用ipv4协议通过tcp传输
    sk = socket.socket()
    #发起连接到server端
    sk.connect(ip_port)
    #给server端发消息
    sk.sendall("I`m client")
    #发送完成后接收server端的反馈
    server_reply = sk.recv(1024)
    #打印server端反馈的信息
    print server_reply
    #关闭连接
    sk.close()

通过以上两段代码的运行,我们就实现了server端与client端的通信

在server端可以到如下运行结果,接收到客户端请求之后又恢复到了等待状态

  1. server waiting...
  2. I`m client
  3. server waiting...

在client端也看到了类似的结果,成功接收到了server端的发来的信息之后退出了程序

点击(此处)折叠或打开

  1. I`m server


拓展:实时解析客户端的日志文件并发送至服务端保存

server端改写
  1. # -*- coding: utf-8 -*-
  2. import socket
  3. import os

  4. def save_to_txt(addr,data):
  5.                 path='/tmp/'+addr+'/slow.log'
  6.                 file_path = os.path.split(path)
  7.                 if not os.path.exists( file_path[0] ):
  8.                         os.makedirs( file_path[0] )
  9.                         print '创建目录成功'
  10.                 if len(data)>0:
  11.                         try:
  12.                                 with open( path.encode('utf-8'),'ab' ) as f:
  13.                                         data = data+"\n"
  14.                                         f.write( data.encode('utf-8') )
  15.                                         
  16.                         except:
  17.                                 print '数据插入失败'
  18.                 else:
  19.                         print '没有数据'


  20. #定义服务器端启动后要绑定的ip和端口
  21. ip_port = ('0.0.0.0',9999)
  22. # 创建socket对象并指定连接的网络类型和传输协议
  23. sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  24. #绑定ip和端口号
  25. sk.bind(ip_port)
  26. #启动监听,并设置最多可以通知连入连接数
  27. sk.listen(5)
  28. #用while使程序一直运行
  29. while True:
  30.     #print 'server waiting...'
  31.     """
  32.     进入accpet阻塞状态来等待客户端的连接请求
  33.     保存客户端的连接状态和客户端的地址
  34.     """
  35.     conn,addr = sk.accept()
  36.     print addr
  37.     #如果有客户端发来请求就每次都只接受1024个字节的内容,注意recv()也是阻塞的
  38.     client_data = conn.recv(10240)
  39.     #打印从客户端接收到的字符串
  40.     print client_data
  41.     save_to_txt(addr[0],client_data) ----接送并写入日志文件
  42.     #向客户端发送字符串
  43.     conn.sendall("I`m server")
  44.     #关闭连接
  45.     conn.close()
client改写
# -*- coding: utf-8 -*-
import socket
def sendtxt(line):
    ip_port = ('192.168.2.136',9999)
    #创建socket实例,参数不填的话就采用ipv4协议通过tcp传输
    sk = socket.socket()
    #发起连接到server端
    sk.connect(ip_port)
    #给server端发消息
    sk.sendall(line)
    #发送完成后接收server端的反馈
    server_reply = sk.recv(10240)
    #打印server端反馈的信息
    print server_reply
    #关闭连接
    sk.close()


import fileinput
import time
import os

target_file = 'log.txt'
init_flag = True # 初次加载程序

record_count = 0

while True:
        if init_flag:
            #读取整个文件
            # for eachline in fileinput.input(target_file):
            # print eachline
            # record_count += 1
            total_count = os.popen('wc -l %s' % target_file).read().split()[0]
            total_count = int(total_count)
            record_count = total_count

            init_flag = False
        else:
            #如果总行数小于当前行,那么认为文件更新了,从第一行开始读。
            total_count = os.popen('wc -l %s' % target_file).read().split()[0]
            total_count = int(total_count)
            if total_count < record_count:
                record_count = 0

            for eachline in fileinput.input(target_file):
                line_no = fileinput.filelineno()
                if line_no > record_count:
                   if len(eachline.strip('\n')) > 0:
                       print eachline.strip('\n')
                       sendtxt(eachline.strip('\n')) --发送                        record_count += 1
                   else:
                       sendtxt(' ')
                       record_count += 1

参考:
http://830909.blog.51cto.com/8311014/1723348
http://youzao.blog.51cto.com/3946111/1255882
http://www.cnblogs.com/wowoo1121/p/5381971.html
http://blog.youkuaiyun.com/u012063703/article/details/46007299



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29096438/viewspace-2147022/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29096438/viewspace-2147022/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值