Android——通过socket编程发送图片

标签 android sockets

我正在实现一个套接字应用程序,其中一部手机将作为客户端,另一部手机将成为服务器。该程序能够使用 print writer 将字符串从客户端发送到服务器,但是当我尝试发送图像文件时,它会抛出异常。如果有人能帮助我,我将不胜感激。

这是服务器的代码

public class ServerActivity extends Activity {

private TextView serverStatus;
private ImageView profile;

// DEFAULT IP
public static String SERVERIP = "10.0.2.15";

// DESIGNATE A PORT
public static final int SERVERPORT = 8080;

private Handler handler = new Handler();

private ServerSocket serverSocket;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.server);
    serverStatus = (TextView) findViewById(R.id.server_status);
    profile = (ImageView) findViewById(R.id.image);

    String filepath = "/sdcard/DCIM/time table.png";
    File imagefile = new File(filepath);
    FileInputStream fis = null;
         try {
             fis = new FileInputStream(imagefile);
         } catch (FileNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

     Bitmap bm = BitmapFactory.decodeStream(fis);
     profile.setImageBitmap(bm);

    SERVERIP = getLocalIpAddress();

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

public class ServerThread implements Runnable {
    //String line;
    byte [] line;
    Bitmap bitmap;
    public void run() {
        try {
            if (SERVERIP != null) {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Listening on IP: " + SERVERIP);
                    }
                });
                serverSocket = new ServerSocket(SERVERPORT);
                while (true) {
                    // LISTEN FOR INCOMING CLIENTS
                    Socket client = serverSocket.accept();
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            serverStatus.setText("Connected.");
                        }
                    });

                    try {
                        /*InputStream in = client.getInputStream();
                        line = null;
                        in.read(line);

                            Log.d("ServerActivity", line.toString());
                            bitmap = BitmapFactory.decodeByteArray(line , 0, line.length);*/
                        int bytesRead;
                        int current = 0;
                        int filesize=65383; 
                        byte [] mybytearray2  = new byte [filesize];
                        InputStream is = client.getInputStream();
                        FileOutputStream fos = new FileOutputStream("/storage/sdcard0/Pictures/Screenshots/IMG-20130112-WA0011.jpeg"); // destination path and name of file
                        //FileOutputStream fos = new FileOutputStream("/storage/sdcard0/Pictures/Screenshots/");
                        BufferedOutputStream bos = new BufferedOutputStream(fos);
                        bytesRead = is.read(mybytearray2,0,mybytearray2.length);
                        current = bytesRead;


                        do {
                           bytesRead =
                              is.read(mybytearray2, current, (mybytearray2.length-current));
                           if(bytesRead >= 0) current += bytesRead;
                        } while(bytesRead > -1);

                        bos.write(mybytearray2, 0 , current);
                        bos.flush();
                        long end = System.currentTimeMillis();
                        //System.out.println(end-start);
                        bos.close();


                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    profile.setImageBitmap(bitmap);

                                    //serverStatus.setText(line);
                                }
                            });

                        /*BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
                        line = null;
                        while ((line = in.readLine()) != null) {
                            Log.d("ServerActivity", line);
                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                    serverStatus.setText(line);
                                    // DO WHATEVER YOU WANT TO THE FRONT END
                                    // THIS IS WHERE YOU CAN BE CREATIVE
                                }
                            });
                        }*/
                        break;
                    } catch (Exception e) {
                        handler.post(new Runnable() {
                            @Override
                            public void run() {
                                serverStatus.setText("Oops. Connection interrupted. Please reconnect your phones.");
                            }
                        });
                        e.printStackTrace();
                    }
                }
            } else {
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        serverStatus.setText("Couldn't detect internet connection.");
                    }
                });
            }
        } catch (Exception e) {
            handler.post(new Runnable() {
                @Override
                public void run() {
                    serverStatus.setText("Error");
                }
            });
            e.printStackTrace();
        }
    }
}

// GETS THE IP ADDRESS OF YOUR PHONE'S NETWORK
private String getLocalIpAddress() {
    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()) { return inetAddress.getHostAddress().toString(); }
            }
        }
    } catch (SocketException ex) {
        Log.e("ServerActivity", ex.toString());
    }
    return null;
}

@Override
protected void onStop() {
    super.onStop();
    try {
         // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
         serverSocket.close();
     } catch (IOException e) {
         e.printStackTrace();
     }
}

这是客户端代码

public class ClientActivity extends Activity {

private EditText serverIp;

private Button connectPhones;

private String serverIpAddress = "";

private boolean connected = false;

private Handler handler = new Handler();

private Socket socket;

private ImageView profile;

private byte [] imgbyte;
String filepath;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.client);

    serverIp = (EditText) findViewById(R.id.server_ip);
    connectPhones = (Button) findViewById(R.id.connect_phones);
    connectPhones.setOnClickListener(connectListener);
    profile = (ImageView) findViewById(R.id.imageView1);

    filepath = "/sdcard/small.jpg";
    File imagefile = new File(filepath);
    FileInputStream fis = null;
         try {
             fis = new FileInputStream(imagefile);
         } catch (FileNotFoundException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         }

     Bitmap bm = BitmapFactory.decodeStream(fis);
     imgbyte = getBytesFromBitmap(bm);
     profile.setImageBitmap(bm);
}

private OnClickListener connectListener = new OnClickListener() {

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

public class ClientThread implements Runnable {

    public void run() {
        try {
            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            Log.d("ClientActivity", "C: Connecting...");
            socket = new Socket(serverAddr, ServerActivity.SERVERPORT);
            connected = true;
            while (connected) {
                try {


                    /*File myFile = new File (filepath); 
                    byte [] mybytearray  = new byte [(int)myFile.length()];
                    FileInputStream fis = new FileInputStream(myFile);
                    BufferedInputStream bis = new BufferedInputStream(fis);
                    bis.read(mybytearray,0,mybytearray.length);
                    OutputStream os = socket.getOutputStream();
                    Log.d("ClientActivity", "C: Sending command.");
                    //System.out.println("Sending...");
                    os.write(mybytearray,0,mybytearray.length);
                    os.flush();*/

                    Log.d("ClientActivity", "C: Sending command.");
                    /*PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
                                .getOutputStream())), true);*/
                        // WHERE YOU ISSUE THE COMMANDS

                    OutputStream output = socket.getOutputStream();
                    Log.d("ClientActivity", "C: image writing.");
                    output.write(imgbyte);
                    output.flush();
                       // out.println("Hey Server!");
                        Log.d("ClientActivity", "C: Sent.");
                } catch (Exception e) {
                    Log.e("ClientActivity", "S: Error", e);
                }
            }
            socket.close();
            Log.d("ClientActivity", "C: Closed.");
        } catch (Exception e) {
            Log.e("ClientActivity", "C: Error", e);
            connected = false;
        }
    }
}

protected void onStop() {
    super.onStop();
    try {
         // MAKE SURE YOU CLOSE THE SOCKET UPON EXITING
         socket.close();
         connected = false;
     } catch (IOException e) {
         e.printStackTrace();
     }
}

public byte[] getBytesFromBitmap(Bitmap bitmap) {
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.JPEG, 70, stream);
    return stream.toByteArray();
}

更新: 服务器端代码抛出异常。它是一个异常(exception),上面写着:“糟糕。连接中断。请重新连接您的手机。” 这是抛出的异常: java.lang.RuntimeException:无法在尚未调用 Looper.prepare() 的线程内创建处理程序

最佳答案

谢谢大家,我找到错误了。 toast 消息必须在 UI 线程或处理程序中。由于我在非 UI 线程中有一些,它开始抛出异常。

关于Android——通过socket编程发送图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16602736/

相关文章:

java - Android:如何初始化 View 和 Canvas?

android - Amazon Cognito Sync 演示的 API key

Android Studio Gradle 构建风格

c# - 通过C#中的TCP套接字将鼠标坐标发送到Unity Client

java - 将数据以 spreedsheat 形式保存到文件中

android - React-Native Android ScrollView 无法从 onScroll 获取事件

linux - 读取时的套接字行为

node.js - WebSocket 连接到 'wss://' WebSocket 握手期间出错 : Unexpected response code: 400

c++ - boost ASIO : connection rejected on someURL's

c++ - Boost::ASIO:优化以最小的流量,长连接,小消息,立即传递