Android:通过套接字接收到的图像已损坏

2024-03-17

嗨,问题是:服务器正确地将图像发送到客户端(我认为)。从客户端接收到的文件与服务器电话上存在的文件大小相同,因此我猜每个字节都已传输,但图像仍然不可见。服务器和客户端都是安卓手机。预先感谢我希望你能帮助我。

服务器代码:

public class FileActivity extends Activity {

private FileInputStream fileInputStream;
private BufferedInputStream bufferedInputStream;
private OutputStream outputStream;

private byte [] mybytearray;

private String tmp = null;

private TextView tv;

private File myFile;

private int l;

private String path;

private EditText editText;

private ServerSocket serverSocket;

private Socket client;

public static String SERVERIP = "10.0.2.15";

private final int SERVERPORT = 8080;

private byte [] imgbyte;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file);

    tv = (TextView) findViewById(R.id.textView1);
    editText = (EditText) findViewById(R.id.editText1);

    SERVERIP = getLocalIpAddress();

    Thread sThread = new Thread(new ServerThread());
    sThread.start();
}

public void sendListener(View v) {

    tmp = editText.getText().toString();

    path = "/sdcard/" + tmp;

    myFile = new File(path);Log.d("SERVER", "WORKS");           

    l = (int) myFile.length();Log.d("SERVER", "WORKS");

    tv.setText(path + "  " + Integer.toString(l));  

    tmp = Integer.toString(l);  Log.d("SERVER", "WORKS");

    String test = tmp;



    //out.println(tmp);
    Log.d("SERVER", "WORKS");
    try {

        PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(client.getOutputStream())), true);
        out.println(test);
        //out.close();
        Log.d("SERVER", "WORKS");
        byte[] mybytearray = new byte[1024]; //create a byte array to file
        Log.d("SERVER", "WORKS");
        fileInputStream = new FileInputStream(myFile);
         bufferedInputStream = new BufferedInputStream(fileInputStream);  
         Log.d("SERVER", "WORKS");


         Log.d("SERVER", "WORKS");
         try{
             outputStream = client.getOutputStream();
         } catch(Exception e)
         {
             Log.d("OUTPUT", "UFFFF");
             e.printStackTrace();
         }
        /* Log.d("SERVER", "ALMOST");
         outputStream.write(mybytearray, 0, mybytearray.length); Log.d("SERVER", "DONE");//write file to the output stream byte by byte*/
      //  outputStream.flush();
       // outputStream.close();

         Log.d("SERVER", "WORKS");
         int count = 0;
         int size = 0;

         while((count = bufferedInputStream.read(mybytearray, 0 , mybytearray.length)) != -1)
         {
            // count = bufferedInputStream.read(mybytearray, 0 , mybytearray.length);
             size += count;
             Log.d("SERVER", "SEND");
             try{
                 outputStream.write(mybytearray, 0, count);
             } catch(Exception e) {
                 e.printStackTrace();
             }

             Log.d("TEST", Integer.toString(count));
         }
         Log.d("SERVER", "DONE");
         bufferedInputStream.close();
         outputStream.close();
               client.close();
    } catch (Exception e) {

    }   


}


public class ServerThread implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub
        try {
            serverSocket = new ServerSocket(SERVERPORT);
            client = serverSocket.accept();
            //outputStream = client.getOutputStream();

            Log.d("SERVER", "Connesso");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            Log.d("TEST", "UFFFAAA");
        }           
    }

}

private String getLocalIpAddress() {

    String tmp = "";

    int i = 0;

    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) 
                { 

                    tmp += "IP: " + inetAddress.getHostAddress() + "\n"; 

                }
            }
        }
    } catch (SocketException ex) {
        Log.e("ServerActivity", ex.toString());
    }
    return tmp;
}

@Override
protected void onStop() {
    super.onStop();
    try {
         serverSocket.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
}

}

客户端代码:

public class FileActivity extends Activity {

private EditText serverIp, getPort;
private Button connectPhones;
private TextView tv, tvIP;

private Boolean connected = false;

private String serverIpAddress, portStr;

private Socket socket;

private int port, len;

private String filepath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_file);

    tvIP = (TextView) findViewById(R.id.IPtv);
    tv = (TextView) findViewById(R.id.Portatv);
    serverIp = (EditText) findViewById(R.id.server_ip);
    connectPhones = (Button) findViewById(R.id.connect_phones);
    getPort = (EditText) findViewById(R.id.server_port); 
}

public void connectListener(View v)
{
    if (!connected) {
        serverIpAddress = serverIp.getText().toString();
        portStr = getPort.getText().toString();
        if (!serverIpAddress.equals("")) {
            Thread cThread = new Thread(new ClientThread());
            cThread.start();
        }
    }
}

public class ClientThread implements Runnable
{
    @Override
    public void run() {
        // TODO Auto-generated method stub
        port = Integer.parseInt(portStr);

        socket = new Socket();

        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connessione in corso...");
            socket = new Socket(serverAddr, port);
            Log.d("ClientActivity", "C: Connesso!");
            connected = true;

            DataInputStream dis;
            try {
                dis = new DataInputStream(socket.getInputStream());
                int bytes;
                byte[] b = new byte[32];
                BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                String l = in.readLine();
                //String line = Integer.toString(l);
                Log.d("PROVA", l);  
                try
                {
                    len = Integer.parseInt(l); Log.d("CLIENT", Integer.toString(len));
                }
                catch (NumberFormatException e)
                {
                    e.printStackTrace();
                }
                byte[] img = new byte[1082922];  //1082922
                FileOutputStream fos = new FileOutputStream("/sdcard/img.jpg");
                BufferedOutputStream bos = new BufferedOutputStream(fos);

                /*bytes = dis.read(img, 0, img.length);

                bos.write(img, 0, img.length);*/
                int count = 0;
                while ((bytes = dis.read(img)) != -1) {
                    count += bytes;
                    Log.d("CLIENT", Integer.toString(count));
                    Log.d("TEST", Integer.toString(bytes));
                    //Write to file
                    bos.write(img, 0, bytes);
                }
                bos.flush();
                bos.close();
                Log.d("TCP", "Save to file");
            } catch(IOException e){
                e.printStackTrace();
            }                

        } catch (Exception e) {
            Log.e("ClientActivity", "C: Errore", e);
            connected = false;
        }
    }

}

 @Override
    protected void onStop() {
        super.onStop();
        if(connected == true)
        {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }    

}


您在相同的底层流上组合缓冲和非缓冲 I/O。缓冲读取器将通过用任何可用的内容填充其缓冲区来从其他流中窃取数据。您有数据输入和输出流:将它们用于所有用途。您可以通过 writeInt()/readInt() 发送文件大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:通过套接字接收到的图像已损坏 的相关文章

  • 在 C 和 python 中实现 sendall() 和 recvall()

    我目前正在尝试在用 C 编写的服务器中实现 sendall 函数 并在用 python 编写的相应客户端上实现 receiveall 函数 当服务器和客户端都用相同的语言编写时 即都用 c 或都用 python 编写 我可以让服务器和客户端
  • 配置项目 ':react-native-gesture-handler' 时出现问题

    大家好 我已经尝试了很长时间来解决这个问题 但不幸的是我还没有弄清楚如何解决 希望你们能帮助我 所以我有一个反应本机项目和我的朋友 以及我的一位朋友添加 React native gesture handler 包供我们使用 他对这个包没有
  • ndk-build error.opencv2/core/core.hpp:没有这样的文件或目录

    我在 Android 中使用 OpenCV Nonfree 模块时遇到问题 我读了这个教程https sites google com site wghsite technical notes sift surf opencv androi
  • 升级到 Proguard 4.8 后无法导出应用程序

    我刚刚将我的 Android SDK ADT 和 Proguard 升级到最新最好的版本 我的项目在调试模式下编译并运行良好 但是当我尝试导出它的签名版本 APK 时 我收到来自导出向导的错误Eclipse 控制台上没有任何错误日志消息 如
  • 清晰的图标 清晰的 Android 应用程序

    你好 下午好 关于如何提高图标的 png 质量 有什么想法吗 我使用了 Android 开发者页面上的套件 但我无法获得清晰的图像 我的意思是非常清晰 我是否需要以不同的方式加载此图标 而不仅仅是拖入我的布局 谢谢 我使用这个布局
  • Android,如何从 XML 布局添加 Google 地图选项?

    我有一个包含 MapView 的片段 我已将此视图添加到 XML 文件中 如下所示
  • Android 中图像字节表示的每像素字节数

    我目前正在编写一个Android应用程序 需要在其中使用OCR 为了实现这一点 我将 Tesseract 与tesseract android tools 项目 http code google com p tesseract androi
  • MediaPlayer.create() 始终返回 null

    我以前用过媒体播放器 从来没有遇到过这个问题 每当我尝试使用 MediaPlayer create 时 该方法都会给我 null 并且我无法播放声音 我有什么遗漏的吗 public class Game extends Activity p
  • 检测设备方向

    我需要检测 Android 设备方向变化 而无需手动处理传感器数据 同时保持活动方向坚持某个方向 onConfigurationChange不会起作用 因为会让我的活动不旋转 通过使用传感器数据来检测方向变化 我认为这是轮子的发明 因为 A
  • foo.setVisibility(View.GONE) 和parent.removeView(foo) 之间的区别

    如果 foo 是一个视图 那么有什么区别foo setVisibility View GONE and fooParent removeView foo 我对两个语句之前和之后视图的内存消耗特别感兴趣 可见性设置为 GONE 的视图是否会消
  • 如何在Room的数据库迁移中正确添加索引?

    我在迁移 Room 数据库时遇到问题 在更新的数据库中 我必须将一个字段从整数更改为双精度值 我读到它并不像听起来那么容易 为了做到这一点 我必须使用这个更改后的属性创建新的临时表 复制前一个表中的所有值 删除旧的值 最后重命名临时表 我的
  • 使用 Box2d(适用于 Android)进行碰撞检测?

    有人可以解释一下使用 box2d for android 进行碰撞检测的工作原理吗 我无法理解 BBContactListener 以什么方式工作 BBContactListener listener new BBContactListen
  • Android 5 Lollipop 阴影方向或 y 偏移

    是否有可能改变 Y 偏移的阴影方向 现在我有以下布局
  • DialogFragment 关闭事件

    我需要处理 DialogFragment 的结尾 在调用 dismiss 之后 例如 我会在关闭后 包含 片段的活动内显示一个 toast 我该如何处理该事件 覆盖onDismiss 在你的DialogFragment中 或者使用setOn
  • Android - 检测视图上的双击和三次点击

    我一直在尝试构建一个可以检测双敲击和三敲击的敲击检测器 在我的努力失败后 我在网上搜索了很长时间以找到可以使用的东西 但没有运气 奇怪的是 像这样的图书馆如此稀缺 有什么帮助吗 你可以尝试这样的事情 尽管我通常建议不要使用三次点击作为一种模
  • Android:选择 EditField 上焦点上的所有文本

    我试图让 Android 在获得焦点时选择 EditText 字段中的所有文本 我在布局中使用此属性 在两个字段上 android selectAllOnFocus true 我不确定这是否相关 但为了将光标移动到第一个可编辑字段 前面 还
  • 带有工具提示的搜索栏 android

    Hi All 我正在尝试使用工具提示自定义 android 搜索栏 如给定的图像 有没有办法在搜索栏中添加带有拇指的文本视图 或任何其他想法 Thanks 我们可以通过拇指的界限来做到这一点 并在seekbar的progressChange
  • 致命异常:GoogleApiHandler

    在我的项目中 我使用货币化服务 Vungle AppLovin 当我尝试加载广告时 出现此异常 E AndroidRuntime 致命异常 GoogleApiHandler 进程 kz ikar PID 3673 java lang NoS
  • 使用 PDFBox 在 Android 中创建 PDF

    我正在尝试通过我的 Android 应用程序创建 PDFPDFBoxapi 但出现以下错误 java lang NoClassDefFoundError org apache pdfbox pdmodel PDDocument 我已经将以下
  • Android Webview隐私浏览

    我在我的 Android 应用程序中使用 webview 从多个站点获取一些网页 我对 webview 行为有一些疑问 webview 是否存储历史记录 cookie 表单自动填充信息 如果是的话 我们可以阻止它这样做吗 如果 Webvie

随机推荐

  • 如何在 Node.js 中创建函数

    我正在使用 Firebase 函数创建 API 同时我使用 Firebase Firestore 作为我的数据库 我正在使用 Node js 来创建该程序 我想知道如何在 Node js 中创建函数 我将多次调用代码 因为我已经习惯了 Ja
  • 如何更改测试资源管理器的持续时间计时器,使其对于长(>1 秒)测试更有用?

    我在 Visual Studio 2013 中编写了一系列测试用例 这些测试用例通过 Visual Studio 的内置测试资源管理器运行 这些不是单元测试 因此它们都运行至少几秒钟 由于测试内容的性质 其中一些测试的运行时间甚至可能超过
  • Mac 上有什么好的 MongoDB 数据库管理应用程序吗?类似于 Sequel Pro? [复制]

    这个问题在这里已经有答案了 寻找一个可视化 mongodb 中的集合和文档的 GUI 网络上有许多可用的工具 罗博蒙戈 https robomongo org 是最好的和最著名的 Mongo客户端 http www mongoclient
  • 如何使用 Boost::Python 公开原始字节缓冲区?

    我有第三方 C 库 其中一些类方法使用原始字节缓冲区 我不太确定如何在 Boost Python 中处理它 C 库头类似于 class CSomeClass public int load unsigned char pInBufferDa
  • DynamoDB 如何同时支持 Key-Value 和 Document 数据库属性

    根据 DynamoDB 的文档 它支持 NoSQL 的键值和面向文档的属性 即使其他 NoSQL 数据库仅属于一种类型 键值 文档 图形或面向列 它还说 Amazon DynamoDB 基于 Dynamo 的原则构建 3 是 AWS 基础设
  • 必须调用“render :layout => false”才能在 Rails 2.3.3 中正确渲染 js.erb 模板

    我正在运行最新的 Rails 2 3 stable 分支 当前为 2 3 3 我正在使用 JQuery 将 AJAX 请求发布到我的 创建 操作 其中有以下块 respond to do format format js end 我创造了c
  • 如何设置应用内购买(非消耗品)?

    我正在使用一些在线教程在我的应用程序中实现应用程序内购买 但该教程适用于消费品应用内购买 但就我而言 用户只需要购买一次 我修改了代码 在购买应用内购买后禁用 购买按钮 现在一切正常 但问题是 如果我关闭并打开应用程序 购买按钮 就会启用
  • 使用 java 中的参数执行 shell 脚本

    我已经用谷歌搜索了一段时间 每个人似乎都有不同的解决方案 但似乎没有一个对我有用 我都尝试过ProcessBuilder and Runtime 两者都调用 sh直接文件并将其输入 bin bash 没有运气 回到基础 我当前的代码如下 S
  • 如何将 org.w3c.dom.Document 对象转换为字符串?

    我想将 org w3c dom Document 对象转换为字符串 我正在使用 Java 6 并且愿意使用任何能够完成任务的 完全免费 技术 我尝试了这个线程的解决方案 有没有比这段代码更优雅的方法将 XML 文档转换为 Java 中的字符
  • 在 TFS 中获取特定父级的子工作项

    如何在 TFS 中获取特定父级的子工作项 我需要一个平面列表 它将父 ID 作为查询参数并返回子工作项 注意 到目前为止 我只能通过 工作项和直接链接 查询来执行此操作 我们无法通过 工作项平面列表 查询来实现这一点 因为没有字段 条件来查
  • Start-Process 在 powershell 远程处理中不起作用

    我一直在尝试使用 powershell 远程处理来运行计算器 我进入了 powershell 会话 Enter PSSession 并输入以下命令 Start Process calc exe 我查看了远程计算机 但没有显示任何内容 当我尝
  • 如何检查字符串是否只包含大写字母或小写字母?

    当且仅当 s 中至少有一个字母字符且 s 中的字母字符全部大写或全部小写时 才返回 True def upper lower s str gt bool gt gt gt upper lower abc True gt gt gt uppe
  • 如何在 Xampp 安装的 Windows 上的 Apache 中禁用 SSLv3

    我正在尝试在 Apache 中禁用 SSLv3 该 Apache 是通过 xampp 安装在 Windows 上的 但我很难弄清楚如何做 有人告诉我我需要添加 SSLProtocol All SSLv2 SSLv3 到我的 ssl 配置文件
  • Haskell 函数名称中允许使用哪些字符?

    函数的有效名称是什么 Examples works let x x x let x x x doesn t work let x x x let x x x 我不确定 但我的预感是 Haskell 不允许 Unicode 函数名称 是吗 U
  • 如何从pairwise.t.test获取df和t值?

    有没有办法从a中获取t值和dfpairwise t test对于相关数据 Example data lt c 2 3 2 2 5 2 4 2 4 3 4 2 time lt c 1 1 1 1 2 2 2 2 3 3 3 3 pairwis
  • 如何在 .COM 可执行文件中以相反顺序打印字符串?

    我刚刚开始学习汇编语言 我正在尝试以相反的顺序打印 hello world 这意味着 dlrow olleh 问题是我只得到第一个字母作为输出 并且顺序仍然相同 没有任何变化 作为一个新手 很多事情对我来说都是未知的 我犯了很多错误 由于缺
  • keytool如何保护密钥?

    当您使用 Java Keytool 实用程序构建密钥存储时 如何保护密钥 我通读了文档 我意识到每个私钥都有一个密钥密码 然后商店有一个商店密码 但是使用什么机制来保护数据呢 它是加密密码吗 如果是的话 算法是什么 我特别关注 keytoo
  • 即使我完全信任,WebPermission 异常

    我正在尝试执行我认为简单的 HttpWebRequest 代码位于 dll 深处 因此我无法提供小代码片段 但它应该相对简单 但我遇到了安全异常 System Security SecurityException Request for t
  • 如何解决客户端-服务器应用程序中的无状态问题?

    我读过一些有关创建无状态网站的书籍 也读过一些有关有状态客户端应用程序的书籍 但是当您必须将两者结合起来时 就会出现很多复杂性 我们有一个 Flex 应用程序 需要通过 NET 服务将数据保存到数据库中 需要记住的事情是 并发 乐观 悲观
  • Android:通过套接字接收到的图像已损坏

    嗨 问题是 服务器正确地将图像发送到客户端 我认为 从客户端接收到的文件与服务器电话上存在的文件大小相同 因此我猜每个字节都已传输 但图像仍然不可见 服务器和客户端都是安卓手机 预先感谢我希望你能帮助我 服务器代码 public class