socket官方文档:https://docs.python.org/2/library/socket.html

socket中文详细介绍:http://blog.csdn.net/rebelqsp/article/details/22109925

查看某端口是否被占用(如6666端口):sudo netstat -nap | grep 6666 如果没有查找到6666端口则说明没有被占用(额,有点废话了~~)

客户端

  • 创建 socket
  • 连接到远程服务器
  • 发送数据
  • 接收数据
  • 关闭 socket
#!/usr/bin/env python
# -*- coding=utf-8 -*- """
file: client.py
socket client
""" import socket
import sys def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))
except socket.error as msg:
print msg
sys.exit(1)
print s.recv(1024)
while 1:
data = raw_input('please input work: ')
s.send(data)
print s.recv(1024)
if data == 'exit':
break
s.close() if __name__ == '__main__':
socket_client()

服务器端

  • 打开 socket
  • 绑定到特定的地址以及端口上
  • 监听连接
  • 建立连接
  • 接收/发送数据
#!/usr/bin/env python
# -*- coding=utf-8 -*- """
file: service.py
socket service
""" import socket
import threading
import time
import sys def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 防止socket server重启后端口被占用(socket.error: [Errno 98] Address already in use)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 6666))
s.listen(10)
except socket.error as msg:
print msg
sys.exit(1)
print 'Waiting connection...' while 1:
conn, addr = s.accept()
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start() def deal_data(conn, addr):
print 'Accept new connection from {0}'.format(addr)
conn.send('Hi, Welcome to the server!')
while 1:
data = conn.recv(1024)
print '{0} client send data is {1}'.format(addr, data)
#time.sleep(1)
if data == 'exit' or not data:
print '{0} connection close'.format(addr)
conn.send('Connection closed!')
break
conn.send('Hello, {0}'.format(data))
conn.close() if __name__ == '__main__':
socket_service()

copy以上两个脚本代码后,如果你想在本地测试,直接运行这两个脚本便是(注:先运行服务端service.py脚本),下图左边是运行服务端脚本,右边打开两个终端与服务端socket进行通信。

一屏开多个终端是不是很屌(强烈建议安装此工具,非常方便好用)

终端增强工具Terminator 
sudo apt-get install terminator # Ubuntu 
yum -y install terminator # Centos

如果你想在两台不同机器上测试,把service.py脚本上传到服务器(假设服务器ip是:192.168.1.2),然后把client.py连接ip改为:192.168.1.2,service.py监听的ip改为:192.168.1.2,接着运行这两个脚本即可

# client.py
s.connect(('192.168.1.2', 6666)) # service.py
s.bind(('192.168.1.2', 6666))

利用socket进行文件、图片等传输

传输文件主要分以下两步:

  • 将要传输的文件的基本信息发送到接收端(文件名、大小等其他信息)
  • 发送端读取文件内容并发送过去,接受端将缓存里面的内容写入文件

注:以下发送文件代码参考:http://www.mamicode.com/info-detail-1346172.html

发送端代码

#!/usr/bin/env python
# -*- coding=utf-8 -*- """
file: send.py
socket client
""" import socket
import os
import sys
import struct def socket_client():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 6666))
except socket.error as msg:
print msg
sys.exit(1) print s.recv(1024) while 1:
filepath = raw_input('please input file path: ')
if os.path.isfile(filepath):
# 定义定义文件信息。128s表示文件名为128bytes长,l表示一个int或log文件类型,在此为文件大小
fileinfo_size = struct.calcsize('128sl')
# 定义文件头信息,包含文件名和文件大小
fhead = struct.pack('128sl', os.path.basename(filepath),
os.stat(filepath).st_size)
s.send(fhead)
print 'client filepath: {0}'.format(filepath) fp = open(filepath, 'rb')
while 1:
data = fp.read(1024)
if not data:
print '{0} file send over...'.format(filepath)
break
s.send(data)
s.close()
break if __name__ == '__main__':
socket_client()

接收端代码

#!/usr/bin/env python
# -*- coding=utf-8 -*- """
file: recv.py
socket service
""" import socket
import threading
import time
import sys
import os
import struct def socket_service():
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('127.0.0.1', 6666))
s.listen(10)
except socket.error as msg:
print msg
sys.exit(1)
print 'Waiting connection...' while 1:
conn, addr = s.accept()
t = threading.Thread(target=deal_data, args=(conn, addr))
t.start() def deal_data(conn, addr):
print 'Accept new connection from {0}'.format(addr)
#conn.settimeout(500)
conn.send('Hi, Welcome to the server!') while 1:
fileinfo_size = struct.calcsize('128sl')
buf = conn.recv(fileinfo_size)
if buf:
filename, filesize = struct.unpack('128sl', buf)
fn = filename.strip('\00')
new_filename = os.path.join('./', 'new_' + fn)
print 'file new name is {0}, filesize if {1}'.format(new_filename,
filesize) recvd_size = 0 # 定义已接收文件的大小
fp = open(new_filename, 'wb')
print 'start receiving...' while not recvd_size == filesize:
if filesize - recvd_size > 1024:
data = conn.recv(1024)
recvd_size += len(data)
else:
data = conn.recv(filesize - recvd_size)
recvd_size = filesize
fp.write(data)
fp.close()
print 'end receive...'
conn.close()
break if __name__ == '__main__':
socket_service()

打开两个终端,分别运行recv.pysend.py脚本,输入待传输文件的全路径和文件名(如:/home/test.txt),你就会在recv.py脚本路径下看到刚输入的传输文件,且文件名为new_****

socket发送文字、图片、文件---基于python实现的更多相关文章

  1. TCP/IP Socket发送接收图片demo

    一个实例通过client端和server端通讯 客户端通过TCP/IP传输资源文件,比如图片,文字,音频,视频等..... 服务端接受到文件存入本地磁盘,返回接受到:“收到来自于"+s.ge ...

  2. FreeCAD stp文件基于python脚本操作

    FreeCAD对于3D模型处理这块的东西封装的还是很完善的,所以移植这块的东西还是有必要的! 首先下载FreeCAD编译好的库: https://www.freecadweb.org/wiki/Dow ...

  3. HttpClient4的使用,模拟浏览器登陆新浪微博,发表微博和文字+图片微博

    HttpClient4,最原始的需求就是使用其来模拟浏览器想服务器发起http请求,当然,他的功能不止于此,但是我需要的就是这个功能而已,jdk也有其自带的类似的api:UrlConnection,效 ...

  4. python 通过 socket 发送文件

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

  5. C# socket 发送图片和文件

    先说服务端:界面:如图: 界面设计源码 namespace SocketJPGToTxt { partial class Form1 { /// <summary> /// 必需的设计器变 ...

  6. Python 基于Python实现邮件发送

    基于Python实现邮件发送   by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7   注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...

  7. java中图片文件的传输及显示(Socket以及ServerSocket演示)

    //客户端部分 package testSix; import java.awt.Graphics; import java.io.IOException; import java.io.InputS ...

  8. 基于Python的数据分析(3):文件和时间

    在接下来的章节中,我会重点介绍一下我自己写的基于之前做python数据分析的打包接口文件common_lib,可以认为是专用于python的第三方支持库.common_lib目前包括文件操作.时间操作 ...

  9. python 指定日期图片文件删除

    手机使用python操作图片文件 起因 前几天去国图拍了一本书,一本心理学方面的书,也许你问我为什么不去买一本,或者去网上找pdf. 其实吧,关于心理学方面的书可以说在市面上一抓就是一堆,至于拍这本书 ...

随机推荐

  1. iOS利用block实现链式编程方法(Objective-C链式编程)

    objc利用block实现链式编程方法 因为不好读.block和其他语言的匿名函数一样,很多程序员刚开始很难主动去用他. 本文描述block作为属性的实际使用,看懂block,并讲解如何利用block ...

  2. Mysql存中文字符出错:Incorrect string value: '\xC2\xE9\xD7\xED\解决方法

    1.数据库连接设置编码格式为UTF-8 jdbc:mysql://localhost:3306/jbpm_test?useUnicode=true&characterEncoding=UTF- ...

  3. 使用babel

    1).Babel支持NPM包形式的安装,打开命令行窗口,切换到项目根目录,命令如下 npm install babel-cli 2).安装成功后,在package.json文件里添加如下代码 &quo ...

  4. vue-nuxt.js部署到宝塔主机服务器

    废话不多说,直接上步骤,如下: 本文章为在 vue环境下使用了nuxt.js 1.搭建环境--由于本人安装的是宝塔主机,因此如下: 由于我直接使用的是宝塔主机,直接去“软件管理”安装 PM2管理器. ...

  5. PHP-学习笔记-进阶

    PHP-学习笔记-进阶 PHP类和对象之定义类的方法 访问控制的关键字代表的意义为: public:公开的 protected:受保护的 private:私有的 我们可以这样定义方法: class C ...

  6. Java学习笔记三十一:Java 包(package)

    Java 包(package) 一:包的作用: 如果我们在使用eclipse等工具创建Java工程的时候,经常会创建包,那么,这个包是什么呢. 为了更好地组织类,Java 提供了包机制,用于区别类名的 ...

  7. VC6无法生成Release版本程序

    在工程设置,将Setting for后面的选项改为Win32 Release.然后重新编译.结果仍然没有生成release,而且打开设置时,依然是Win32 Debug. 解决办法,在VC6.0的工具 ...

  8. GD32F450 200M时USB不稳定

    使用GD32F450的demo修改usb驱动,发现120M和168M时正常,200M时很不稳定.怀疑USB时钟分频有问题,一查果然是,记录如下: 200M是库函数主时钟分频代码如下 static vo ...

  9. 在linux环境下安装redis并且搭建自己的redis集群

    此文档主要介绍在linux环境下安装redis并且搭建自己的redis集群 搭建环境: ubuntun 16.04 + redis-3.0.6 本文章分为三个部分:redis安装.搭建redis集群 ...

  10. 20155307 实验一《Java开发环境的熟悉》实验报告

    (一)命令行下Java程序开发 题目:实现Fibonacci数列功能,并进行测试 命令行下的程序截图 上传到了码云: 遇到的问题? 可以直接使用Javac,不加环境变量也行,但是文件的名字与类名必须一 ...