广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python socket编程(传输字符
  • 117
分享到

python socket编程(传输字符

字符pythonsocket 2023-01-31 06:01:40 117人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

Socket官方文档:https://docs.python.org/2/library/socket.html socket中文详细介绍:Http://blog.csdn.net/rebelqsp/article/details

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进行通信。

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_****

--结束END--

本文标题: python socket编程(传输字符

本文链接: https://www.lsjlt.com/news/190668.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python socket编程(传输字符
    socket官方文档:https://docs.python.org/2/library/socket.html socket中文详细介绍:http://blog.csdn.net/rebelqsp/article/details...
    99+
    2023-01-31
    字符 python socket
  • Python Socket传输文件示例
    发送端可以不停的发送新文件,接收端可以不停的接收新文件。 例如:发送端输入:e:visio.rar,接收端会默认保存为 e:new_visio.rar,支持多并发,具体实现如下; 接收端: 方法一: ...
    99+
    2022-06-04
    示例 传输文件 Python
  • python socket编程
    socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开...
    99+
    2023-01-31
    python socket
  • Python-socket编程
    一.socket编程Socket 是网络编程的一个抽象概念。通常我们用一个 Socket 表示“打开了一个网络链接”,而打开一个 Socket 需要知道目标计算机的 IP地址和端口号,再指定协议类型即可。二.Python的socket编程实...
    99+
    2023-01-31
    Python socket
  • python的socket编程
    转自http://www.oschina.net/question/12_76126 参考http://www.cnblogs.com/waniu/archive/2012/08/08/2628390.html 一个简单的python so...
    99+
    2023-01-31
    python socket
  • 46. Python Socket编程
    复习:消息队列为了防止消息丢失,或者是调用方,不需一直等待响应方的结果。# threadtest.pyimport codecs from queue import Queue from threading import Thread i...
    99+
    2023-01-31
    Python Socket
  • 47. Python socket编程
    1.获取百度返回信息import socket host = "www.baidu.com" port = 80 ip = socket.gethostname(host) #获取访问百度的时候解析出来的IP地址。(vip) print (...
    99+
    2023-01-31
    Python socket
  • python使用socket实现图像传输功能
    在python中使用socket进行linux服务器与win10主机间的图像传输,供大家参考,具体内容如下 前提:服务器与主机需要在同一局域网内 使用方法: (1)分别将下面两段代码存入对应位置 (2)先运行服务器端...
    99+
    2022-06-02
    python socket 图像传输
  • python网络编程-socket编程
    一、服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站)   C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发   二、OSI七层模型 互联网协议按照功能不同分为...
    99+
    2023-01-31
    网络编程 python socket
  • python利用socket实现udp文件传输功能
    本文实例为大家分享了UDP实现文件传输的具体代码,供大家参考,具体内容如下 tcp进行文件传输看这里–python实现TCP文件接发 这里实现的接收方一直接收,发送方每次发送一个文件...
    99+
    2022-11-12
  • Python 的 Socket 编程教程
    原文出处:http://www.oschina.net/question/12_76126 这是用来快速学习 Python Socket 套接字编程的指南和教程。Python 的 Socket 编程跟 C 语言很像。Python 官方关于 ...
    99+
    2023-01-31
    教程 Python Socket
  • Python Socket编程详解
    目录背景TCP和UDP协议本质上的区别?TCP/IP协议栈、HTTP协议、Socket之间的区别和联系?TCPSocket服务器的通信过程?socket和websocket之间的联系...
    99+
    2022-11-12
  • python网络编程--socket
    1.服务端1.1声明socket对象server=socket.socket(AF.INET,socket.SOCK_STREAM)1.2绑定ip、端口server.bind(localhost,6969)1.3开始监听server.lis...
    99+
    2023-01-31
    网络编程 python socket
  • Python—网络编程Socket
    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数...
    99+
    2023-01-31
    网络编程 Python Socket
  • python字符编码
    近期接触到python的编码相关的东西,发现自己了解的不是太系统,故通过搜索资料做了一些总结。 字符编码 字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题。 我们知道,计算机内部,所有信息最终都是一个二进制值。每一个二进制位...
    99+
    2023-01-31
    字符 python
  • python如何输出字符串
    python中输出字符串的方法:在python中可以使用print函数进行打印输出,该函数在Python3.x是一个函数,但在 Python2.x版本不是一个函数,只是一个关键字。具体使用步骤:首先打开python编辑器,新建一个pytho...
    99+
    2022-10-06
  • 【python】 倒序输出字符串
    By Dolphin , 20150730Title :    编写一个程序,获取用户输入的一条信息,然后将其倒序输出。Code:# Reverse Word # By Dolphin,20150730 # word = input("P...
    99+
    2023-01-31
    字符串 python
  • Python格式化字符串输出的过程
    本篇内容主要讲解“Python格式化字符串输出的过程”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python格式化字符串输出的过程”吧! ...
    99+
    2022-10-18
  • 【Python】Python 网络编程 ( Socket 套接字简介 | Socket 套接字使用步骤 | Socket 套接字服务端与客户端开发 )
    文章目录 一、Socket 套接字简介1、Socket 套接字概念2、Socket 套接字类型3、Socket 套接字使用步骤4、Socket 套接字服务端与客户端 二、Socket 服务...
    99+
    2023-08-31
    Python socket 网络编程 TCP UDP 原力计划
  • 简单讲解Python中的字符串与字符串的输入输出
    字符串 字符串用''或者""括起来,如果字符串内部有‘或者",需要使用进行转义 >>> print 'I'm ok.' I'm ok. 转义字符可以转义很多字符,比如n表示换行,...
    99+
    2022-06-04
    字符串 输入输出 简单
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作