如何进行socket通信

本篇文章为大家展示了如何进行socket通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

创新互联网站建设提供从项目策划、软件开发,软件安全维护、网站优化(SEO)、网站分析、效果评估等整套的建站服务,主营业务为网站设计制作、成都做网站,重庆App定制开发以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。创新互联深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

一、使用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改写

  1. # -*- coding: utf-8 -*-

  2. import socket

  3. def sendtxt(line):

  4.     ip_port = ('192.168.2.136',9999)

  5.     #创建socket实例,参数不填的话就采用ipv4协议通过tcp传输

  6.     sk = socket.socket()

  7.     #发起连接到server端

  8.     sk.connect(ip_port)

  9.     #给server端发消息

  10.     sk.sendall(line)

  11.     #发送完成后接收server端的反馈

  12.     server_reply = sk.recv(10240)

  13.     #打印server端反馈的信息

  14.     print server_reply

  15.     #关闭连接

  16.     sk.close()



  17. import fileinput

  18. import time

  19. import os


  20. target_file = 'log.txt'

  21. init_flag = True  # 初次加载程序


  22. record_count = 0


  23. while True:

  24.         if init_flag:

  25.             #读取整个文件

  26.             # for eachline in fileinput.input(target_file):

  27.             #    print eachline

  28.             #    record_count += 1

  29.             total_count = os.popen('wc -l %s' % target_file).read().split()[0]

  30.             total_count = int(total_count)

  31.             record_count = total_count


  32.             init_flag = False

  33.         else:

  34.             #如果总行数小于当前行,那么认为文件更新了,从第一行开始读。

  35.             total_count = os.popen('wc -l %s' % target_file).read().split()[0]

  36.             total_count = int(total_count)

  37.             if total_count < record_count:

  38.                 record_count = 0


  39.             for eachline in fileinput.input(target_file):

  40.                 line_no = fileinput.filelineno()

  41.                 if line_no > record_count:

  42.                    if len(eachline.strip('\n')) > 0:

  43.                        print eachline.strip('\n')

  44.                        sendtxt(eachline.strip('\n')) --发送

  45.                        record_count += 1

  46.                    else:

  47.                        sendtxt('        ')

  48.                        record_count += 1

上述内容就是如何进行socket通信,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。


文章名称:如何进行socket通信
转载注明:http://scyanting.com/article/gepecg.html