J2ME中通过Http协议传输图片

原创 2004年09月16日 08:29:00
        曾经在CSDN看到多位网友问图片传输的问题,因此决定写篇文章讲述一个问题,最后通过实例演示如何解决这个问题并提供源代码。如果你对联网中的操作以及多线程还不熟悉那么请参考本站如下文章。
    编写高效友好的多线程J2ME联网应用
    开发J2ME低级联网应用 
   
开发J2ME联网应用程序

    其实传输图片和传输其他的数据没有什么区别只是我们选择怎样的处理方法,如果我们传输java基本数据类型或者String那么比较容易,直接writeInt()  readInt()等方法就可以了。如果是传输一整个对象比如一个人的信息,那么可以使用序列化把它拆开为按照一定的顺序传输多个java的基本类型和String。至于图片显得要特殊一点,因为它是二进制的文件,Java中的InputStream提供了方法来读取二进制文件,如果你对此方面的知识不熟悉请参考使用Java操作二进制文件

    在我们联网的时候同样还是要在另外一个线程进行,为了提高效率我们使用wait()和notify()来调度线程,线程启动后会进入wait()的状态,因为我们在midlet对象上调用了wait()。当用户按了Connect Command后我们调用midlet.notify()来让线程继续运行。
        if (cmd == connCommand)
        {
            synchronized (this)
            {
                notify();
            }
        } else if (cmd == exitCommand)
        {
            exitMIDlet();
        }

            synchronized (midlet)
            {
                try
                {
                    midlet.wait();
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            System.out.println("connect to server...");

    当读取Image文件的时候,我们建立连接后就可以得到InputStream的实例了,接收数据显得比较重要。我采用的方法是新建一个ByteArrayOutputStream实例baos,然后通过read()得到字节首先写入到baos里面去。传输结束后通过baos.toByteArray()得到Image的字节数据,这样我们就可以很容易的构建出图片来了,最后把它显示在Form里面。
                httpConn = (HttpConnection) Connector.open(URL);
                is = httpConn.openInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int ch = 0;
                while ((ch = is.read()) != -1)
                {
                    baos.write(ch);
                }
                byte[] imageData = baos.toByteArray();
                Image image = Image.createImage(imageData, 0, imageData.length);
                midlet.setImage(image);
                baos.close();
                is.close();
                httpConn.close();
    首先你应该在web服务器上放一个大小适中的png格式的图片,然后运行本程序进行联网,这样就可以通过http协议传输图片了。

 

 

 

 

 

 

 

 

 

下面是源代码

import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
import javax.microedition.lcdui.*;
import java.io.*;
import javax.microedition.io.*;

public class ImageGetter extends MIDlet implements CommandListener
{

    private Display display;
    public static final Command connCommand = new Command("Connect",
            Command.ITEM, 1);
    public static final Command exitCommand = new Command("Exit", Command.EXIT,
            1);
    private Form mainForm;
    private GetterThread gt;

    protected void startApp() throws MIDletStateChangeException
    {

        display = Display.getDisplay(this);
        mainForm = new Form("Image Getter");
        mainForm.append("Click Connect to get Image");
        mainForm.addCommand(connCommand);
        mainForm.addCommand(exitCommand);
        mainForm.setCommandListener(this);
        display.setCurrent(mainForm);
        gt = new GetterThread(this);
        gt.start();

    }

    public void setImage(Image image)
    {

        mainForm.append(image);
        display.setCurrent(mainForm);
    }

    protected void pauseApp()
    {

    }

    protected void destroyApp(boolean arg0) throws MIDletStateChangeException
    {

    }

    public void commandAction(Command cmd, Displayable disp)
    {
        if (cmd == connCommand)
        {
            synchronized (this)
            {
                notify();
            }
        } else if (cmd == exitCommand)
        {
            exitMIDlet();
        }
    }

    private void exitMIDlet()
    {
        try
        {
            destroyApp(false);
            notifyDestroyed();
        } catch (MIDletStateChangeException e)
        {
            e.printStackTrace();
        }
    }

    class GetterThread extends Thread
    {
        private ImageGetter midlet;
        public static final String URL = "http://localhost/j2medev.png";
        private HttpConnection httpConn = null;
        private InputStream is = null;

        public GetterThread(ImageGetter midlet)
        {
            this.midlet = midlet;
        }

        public void run()
        {
            synchronized (midlet)
            {
                try
                {
                    midlet.wait();
                } catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
            System.out.println("connect to server...");
            try
            {
                httpConn = (HttpConnection) Connector.open(URL);
                is = httpConn.openInputStream();
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                int ch = 0;
                while ((ch = is.read()) != -1)
                {
                    baos.write(ch);
                }
                byte[] imageData = baos.toByteArray();
                Image image = Image.createImage(imageData, 0, imageData.length);
                midlet.setImage(image);
                baos.close();
                is.close();
                httpConn.close();

            } catch (IOException e)
            {
                e.printStackTrace();
            }

        }
    }

}

 

HTTP协议图片上传交互

一、图片搭建 新建服务端项目:用到了servlet3.0之后的一些特性,用tomcat8,项目版本为3.0。不用导入其他相关jar包了就。     新建的Index表单。   3.0的界面,@mul...
  • u013985228
  • u013985228
  • 2015年08月19日 10:39
  • 3617

Http协议获取图片数据流(GET方式)

String filePath = "http://127.0.0.1/doc/pic.jpg";byte[] byteArray; HttpURLConnection connection = nu...
  • sinat_27933301
  • sinat_27933301
  • 2017年06月25日 18:59
  • 756

http 超文本传输协议

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接...
  • zhaoliang831214
  • zhaoliang831214
  • 2016年05月21日 09:58
  • 2615

http协议报头详解

1. 命令行窗口中用telnet测试HTTP协议  HTTP消息是由普通ASCII文本组成。消息包括消息头和数据体部分。消息头以行为单位,每行以CRLF(回车和换行)结束,消息头结束后,额外增加一...
  • weiqubo
  • weiqubo
  • 2014年08月06日 18:50
  • 1946

HTTP协议(超文本传送协议)详解

引言                                         HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年...
  • Genius_Ge
  • Genius_Ge
  • 2017年07月20日 09:01
  • 514

如何使用http或httpClient向服务器上传图片 以及使用http上传图片时协议的描述

向服务器上传图片的实例:   在java web中上传图片相对比较容易,只需简单几个按钮和应用即可,以下的例子是如何使用http或httpClient向本地服务器上传图片。 1.网页版    在本...
  • u011572517
  • u011572517
  • 2016年01月09日 19:51
  • 4876

简述HTTP协议

超文本传输协议HTTP规定了浏览器与服务器之间的请求和响应的格式与规则,它是万维网上能够可靠地交换文件的重要基础。...
  • u014556057
  • u014556057
  • 2017年03月26日 18:01
  • 638

Unity3D 网络通信_HTTP协议:获取网络图片、内容

自己写的测试demo,一个功能一个功能测试着做的,没有什么结构,凑合看吧。 http协议,在手机平台,URL必须必带http://头。 此脚本主要实现了  分别用pose和g...
  • ybhjx
  • ybhjx
  • 2016年05月13日 13:46
  • 1417

有关使用HTTP协议传输二进制文件

HTTP协议是基于字符(ASCII)的,当Content-Type项为text/xml,则内容是文本格式;当二进制格式时,Content-Type项为image/gif,就是了。例如,浏览器请求一张图...
  • liuxiao723846
  • liuxiao723846
  • 2015年07月21日 17:46
  • 4982

http协议与XML书写规范及解析技术

http协议:超文本传输协议。该协议规定了客户端和服务器传输信息的数据流格式,以便在客户端和服务器之间传输数据。http协议遵循的是请求/响应模型。是无状态的协议,占用的是80端口 XML ...
  • u010180155
  • u010180155
  • 2013年05月28日 19:53
  • 2024
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:J2ME中通过Http协议传输图片
举报原因:
原因补充:

(最多只允许输入30个字)