我正在尝试使用TCP协议连接两个 android应用程序. 客户端有一个imageView,当你按下按钮时,它应该将该图像发送到服务器,并在服务器读取后,它会显示图像. 但我无法在服务器中显示发送的图
客户端有一个imageView,当你按下按钮时,它应该将该图像发送到服务器,并在服务器读取后,它会显示图像.
但我无法在服务器中显示发送的图像.
有人可以帮我一把吗?
这是我的服务器代码,它获得了图像并且显示它是显而易见的
package com.example.simpleserver; import java.io.DataInputStream; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.ImageView; import android.widget.TextView; public class SimpleServer extends Activity { ServerSocket ss = null; Thread myCommsThread = null; protected static final int MSG_ID = 0x1337; public static final int SERVERPORT = 6000; private Bitmap bitmap; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_server); TextView tv = (TextView) findViewById(R.id.textView01); tv.setText("Nothing from client yet"); this.myCommsThread = new Thread(new CommsThread()); this.myCommsThread.start(); } @Override protected void onStop() { super.onStop(); try { // make sure you close the socket upon exiting ss.close(); } catch (IOException e) { e.printStackTrace(); } } Handler myUpdateHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case MSG_ID: ImageView tv = (ImageView) findViewById(R.id.imageViewServer); tv.setImageBitmap(bitmap); break; default: break; } super.handleMessage(msg); } }; class CommsThread implements Runnable { public void run() { Socket s = null; try { ss = new ServerSocket(SERVERPORT ); } catch (IOException e) { e.printStackTrace(); } while (!Thread.currentThread().isInterrupted()) { Message m = new Message(); m.what = MSG_ID; try { if (s == null) s = ss.accept(); InputStream in = s.getInputStream(); DataInputStream dis = new DataInputStream(in); int len = dis.readInt(); byte[] data = new byte[len]; if (len > 0) { dis.readFully(data); } bitmap = BitmapFactory.decodeByteArray(data , 0, data .length); myUpdateHandler.sendMessage(m); } catch (IOException e) { e.printStackTrace(); } } } } }
这是我的客户代码,它传达了图像
package com.example.simpleclient; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.nio.ByteBuffer; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.view.View; import android.widget.ImageView; public class SimpleClient extends Activity { private Socket socket; private static final int SERVERPORT = 5000; private static final String SERVER_IP = "10.0.2.2"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_simple_client); new Thread(new ClientThread()).start(); } public void onClick(View view) { try {; getBytes(); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } public void getBytes() throws IOException{ ImageView iv=(ImageView)findViewById(R.id.imageView1); //convert the image to bitmap to be send in the intent Bitmap bmp=((BitmapDrawable)iv.getDrawable()).getBitmap(); int bytes = bmp.getByteCount(); ByteBuffer buffer = ByteBuffer.allocate(bytes); //Create a new buffer bmp.copyPixelsToBuffer(buffer); //Move the byte data to the buffer byte[] array = buffer.array(); int start=0; int len=array.length; if (len < 0) throw new IllegalArgumentException("Negative length not allowed"); if (start < 0 || start >= array.length) throw new IndexOutOfBoundsException("Out of bounds: " + start); OutputStream out = socket.getOutputStream(); DataOutputStream dos = new DataOutputStream(out); dos.writeInt(len); if (len > 0) { dos.write(array, start, len); } } class ClientThread implements Runnable { @Override public void run() { try { InetAddress serverAddr = InetAddress.getByName(SERVER_IP); socket = new Socket(serverAddr, SERVERPORT); } catch (UnknownHostException e1) { e1.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } } }尝试以下代码将您的图像放在一个字节数组中:
ImageView iv=(ImageView)findViewById(R.id.imageView); Bitmap bmp=((BitmapDrawable)iv.getDrawable()).getBitmap(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); byte array [] = baos.toByteArray();
此外,我必须注意你在主线程上执行getBytes().这仅适用于较旧的Android版本.最好把它放在你的线程中.