千家信息网

如何进行socket通信

发表于:2024-09-24 作者:千家信息网编辑
千家信息网最后更新 2024年09月24日,本篇文章为大家展示了如何进行socket通信,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、使用socket实现一对一的简单通信socket就是一个开往网络
千家信息网最后更新 2024年09月24日如何进行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. except:

  16. print '数据插入失败'

  17. else:

  18. print '没有数据'



  19. #定义服务器端启动后要绑定的ip和端口

  20. ip_port = ('0.0.0.0',9999)

  21. # 创建socket对象并指定连接的网络类型和传输协议

  22. sk=sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  23. #绑定ip和端口号

  24. sk.bind(ip_port)

  25. #启动监听,并设置最多可以通知连入连接数

  26. sk.listen(5)

  27. #用while使程序一直运行

  28. while True:

  29. #print 'server waiting...'

  30. """

  31. 进入accpet阻塞状态来等待客户端的连接请求

  32. 保存客户端的连接状态和客户端的地址

  33. """

  34. conn,addr = sk.accept()

  35. print addr

  36. #如果有客户端发来请求就每次都只接受1024个字节的内容,注意recv()也是阻塞的

  37. client_data = conn.recv(10240)

  38. #打印从客户端接收到的字符串

  39. print client_data

  40. save_to_txt(addr[0],client_data) ----接送并写入日志文件

  41. #向客户端发送字符串

  42. conn.sendall("I`m server")

  43. #关闭连接

  44. 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通信,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

0