热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

客户端与服务器如何进行数据传输

感觉自己对于网络传输的问题一直很困惑。网上查阅的资料也不是自己想要的,所以只好到这里来求大神帮助!最近在做聊天室,客户端是android,我自己在本地搭了workerman当做服务器。两边都是采用websocket协议。...
感觉自己对于网络传输的问题一直很困惑。网上查阅的资料也不是自己想要的,所以只好到这里来求大神帮助!

最近在做聊天室,客户端是android,我自己在本地搭了workerman当做服务器。两边都是采用websocket协议。

我用inputstream读取txt文件通过websocket发送到服务器,服务器接受到数据后写入txt文件。这时txt文件正常能够打开。

现在我用同样的方法读取android录音出来的.amr文件发送到服务器并写入.amr文件中,会出现文件损坏无法打开的问题。

基于此,感觉自己平时只注重软件功能的实现而不注重计算机原理的弊端出现了。出现了一些自己也觉得很幼稚的问题:
1:网络之间是如何传输数据的?
我将音频文件读取出来转换成二进制传输到服务端,服务端怎么将这些二进制恢复成原来的文件呢?

2:如何解决上面说的文件损坏无法打开的问题?

还是说我的理解一开始就是错的,感觉将音频文件读取出来就是不行?而应该用什么方法将音频文件进行转换才能传送呢?

客户端android代码:

 mConnection.connect(wsuri, new WebSocketHandler() {

 @Override
 public void onOpen() {
 Log.d(TAG, "Status: Connected to " + wsuri);

 InputStream is = null;
 try {
         is = new FileInputStream(_file);
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     }

 byte[] bytes = new byte[1024];
 int len = 0;

 try {
        while((len=is.read(bytes))!=-1)
        {
            Log.d(TAG, "senBinaryMessage: " + bytes);
            mConnection.sendBinaryMessage(bytes);
        }
        is.close();
     } catch (IOException e) {
        e.printStackTrace();
        }                  
     }                

}

服务端代码:

$worker->OnMessage= function($connection, $data)
{
    $filePath="/Users/myname/Desktop/php/";  
    if (!file_exists($filePath)){//如果指定文件夹不存在,则创建文件夹  
        mkdir($filePath , 0777);  
    }  

    $name=$filePath.'voice'.'.amr';  
    $fp = fopen ($name,"a");  

    if (fwrite ($fp,$data)){  
        echo "写入模板成功";  
    } else {  
        fclose ($fp);  
        echo "写入模板失败!";  
    }     
};

回复内容:

感觉自己对于网络传输的问题一直很困惑。网上查阅的资料也不是自己想要的,所以只好到这里来求大神帮助!

最近在做聊天室,客户端是android,我自己在本地搭了workerman当做服务器。两边都是采用websocket协议。

我用inputstream读取txt文件通过websocket发送到服务器,服务器接受到数据后写入txt文件。这时txt文件正常能够打开。

现在我用同样的方法读取android录音出来的.amr文件发送到服务器并写入.amr文件中,会出现文件损坏无法打开的问题。

基于此,感觉自己平时只注重软件功能的实现而不注重计算机原理的弊端出现了。出现了一些自己也觉得很幼稚的问题:
1:网络之间是如何传输数据的?
我将音频文件读取出来转换成二进制传输到服务端,服务端怎么将这些二进制恢复成原来的文件呢?

2:如何解决上面说的文件损坏无法打开的问题?

还是说我的理解一开始就是错的,感觉将音频文件读取出来就是不行?而应该用什么方法将音频文件进行转换才能传送呢?

客户端android代码:

 mConnection.connect(wsuri, new WebSocketHandler() {

 @Override
 public void onOpen() {
 Log.d(TAG, "Status: Connected to " + wsuri);

 InputStream is = null;
 try {
         is = new FileInputStream(_file);
     } catch (FileNotFoundException e) {
         e.printStackTrace();
     }

 byte[] bytes = new byte[1024];
 int len = 0;

 try {
        while((len=is.read(bytes))!=-1)
        {
            Log.d(TAG, "senBinaryMessage: " + bytes);
            mConnection.sendBinaryMessage(bytes);
        }
        is.close();
     } catch (IOException e) {
        e.printStackTrace();
        }                  
     }                

}

服务端代码:

$worker->OnMessage= function($connection, $data)
{
    $filePath="/Users/myname/Desktop/php/";  
    if (!file_exists($filePath)){//如果指定文件夹不存在,则创建文件夹  
        mkdir($filePath , 0777);  
    }  

    $name=$filePath.'voice'.'.amr';  
    $fp = fopen ($name,"a");  

    if (fwrite ($fp,$data)){  
        echo "写入模板成功";  
    } else {  
        fclose ($fp);  
        echo "写入模板失败!";  
    }     
};

TCP工作方式:
https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%...

我认为文件损坏可能有两种原因
一. fopen 没有使用b标记

https://secure.php.net/manual/zh/function.fopen.php
在操作二进制文件时如果没有指定 'b' 标记,可能会碰到一些奇怪的问题,包括坏掉的图片文件以及关于 \r\n 字符的奇怪问题。

解决方法:
打开文件时加入b标记

phpfopen($name,"ab")

二. 写入成功后没有关闭文件。
这可能会导致:
1. 数据会停留在缓冲区,直到缓冲区已满或程序退出或垃圾回收时关闭文件才会把数据写入文件。(我太清楚php是否会对文件进行垃圾回收)
2. 可能程序退出或垃圾回收时关闭文件的顺序时随机的,这样将会导致数据前后顺序不一致。
用python做个测试

python3a = open('test', 'ab')
a.write(b'123')
b = open('test', 'ab')
b.write(b'456')

b.close()
a.close()

test文件的内容为:

456123

解决方法:
手动关闭文件

phpif (fwrite ($fp,$data)){  
    echo "写入模板成功";  
} else {
    echo "写入模板失败!";  
}
fclose($fp);

或者使用

phpfflush($fp);

来将数据写入缓冲区

因为对php不熟,我没有进行测试。

建议你使用http api来做,因为socket过于底层,很多阻塞问题不是你可以解决的,你可以在服务器端做一个web api,安卓对于http的各项封装都很棒,可以试试 搜索一下apache 的httpclient类库

第一问题,一般网络通信都是基于tcp/ip进行通信,http还有socket都是封装了这些的。通信协议栈以下都是有操作系统维护,一般没有什么问题无
第二个问题 基于socket的网络通信还分有链接和无链接,这个传文件完全可以。什么datainputstream之类的都是可以的。我曾模拟过FTP服务器,跟文件格式无关的。建议考虑一下是否客户端的文件已经完整的传输到服务端了。

服务端代码不对,应该以追加的方式写文件

$worker->OnMessage= function($connection, $data)
{
    $filePath="/Users/myname/Desktop/php/";  
    if (!file_exists($filePath)){//如果指定文件夹不存在,则创建文件夹  
        mkdir($filePath , 0777);  
    }  
    $name=$filePath.'voice'.'.amr';
    // ===这里要以追加的方式写文件===
    file_put_contents($filePath.$name, $data, FILE_APPEND);
}

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Tomcat安装与配置教程及常见问题解决方法
    本文介绍了Tomcat的安装与配置教程,包括jdk版本的选择、域名解析、war文件的部署和访问、常见问题的解决方法等。其中涉及到的问题包括403问题、数据库连接问题、1130错误、2003错误、Java Runtime版本不兼容问题以及502错误等。最后还提到了项目的前后端连接代码的配置。通过本文的指导,读者可以顺利完成Tomcat的安装与配置,并解决常见的问题。 ... [详细]
  • 本文分享了一位Android开发者多年来对于Android开发所需掌握的技能的笔记,包括架构师基础、高级UI开源框架、Android Framework开发、性能优化、音视频精编源码解析、Flutter学习进阶、微信小程序开发以及百大框架源码解读等方面的知识。文章强调了技术栈和布局的重要性,鼓励开发者做好学习规划和技术布局,以提升自己的竞争力和市场价值。 ... [详细]
  • iwanttowriteasimpleAppforme(Android).Forthisitisnecessarythattheservercansenddat ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
author-avatar
mobiledu2502885927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有