problem in getting response from the pc server to my android client using socket connection
I have a problem in getting a message from the server to the Android client. I am sucessfully sending an image file to the server but I want the confirmation of receiving image by sending a message back from the server. Here is the client code:
package com.exercise.AndroidCamera;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.AutoFocusCallback;
import android.hardware.Camera.PictureCallback;
import android.hardware.Camera.ShutterCallback;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore.Images.Media;
import android.view.LayoutInflater;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class AndroidCamera extends Activity implements SurfaceHolder.Callback{
Camera camera;
SurfaceView surfaceView;
SurfaceHolder surfaceHolder;
boolean previewing = false;
LayoutInflater controlInflater = null;
long start;
long end;
TextView txt;
Button buttonTakePicture;
String message;
final int RESULT_SAVEIMAGE = 0;
Socket socket;
BufferedReader reader;
OutputStream os;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
getWindow().setFormat(PixelFormat.UNKNOWN);
surfaceView = (SurfaceView)findViewById(R.id.camerapreview);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
controlInflater = LayoutInflater.from(getBaseContext());
View viewControl = controlInflater.inflate(R.layout.control, null);
LayoutParams layoutParamsControl
= new LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT);
this.addContentView(viewControl, layoutParamsControl);
txt=(TextView)findViewById(R.id.response);
buttonTakePicture = (Button)findViewById(R.id.takepicture);
/* Thread readerThread=new Thread(new IncomingReader());
readerThread.start();*/
buttonTakePicture.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View arg0) {
start = System.currentTimeMillis();
// TODO Auto-generated method stub
camera.takePicture(myShutterCallback,
myPictureCallback_RAW, myPictureCallback_JPG);
}});
LinearLayout layoutBackground = (LinearLayout)findViewById(R.id.background);
layoutBackground.setOnClickListener(new LinearLayout.OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
buttonTakePicture.setEnabled(false);
camera.autoFocus(myAutoFocusCallback);
}});
}
AutoFocusCallback myAutoFocusCallback = new AutoFocusCallback(){
@Override
public void onAutoFocus(boolean arg0, Camera arg1) {
// TODO Auto-generated method stub
buttonTakePicture.setEnabled(true);
}};
ShutterCallback myShutterCallback = new ShutterCallback(){
@Override
public void onShutter() {
// TODO Auto-generated method stub
}};
PictureCallback myPictureCallback_RAW = new PictureCallback(){
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO Auto-generated method stub
}};
PictureCallback myPictureCallback_JPG = new PictureCallback(){
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
setUpNetworking();
// TODO Auto-generated method stub
/*Bitmap bitmapPicture
= BitmapFactory.decodeByteArray(arg0, 0, arg0.length);
bitmapPicture .compress(Bitmap.CompressFormat.JPEG,100,f);*/
//Socket socket = null;
//Uri uriTarget = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, new ContentValues());
//OutputStream imageFileOS;
//
//OutputStream os=null;
//PrintWriter out=null;
//BufferedReader reader;
try {
//String temp="hello";
/*imageFileOS = getContentResolver().openOutputStream(uriTarget);
imageFileOS.write(arg0);
imageFileOS.flush();
imageFileOS.close();
socket = new Socket("192.168.1.12",8787);
Toast.makeText(AndroidCamera.this,
"Image saved: " + uriTarget.toString(),
Toast.LENGTH_LONG).show();
File myFile = new File (uriTarget.toString());
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);*/
//Toast.makeText(AndroidCamera.this,
// "Image saved: " + arg0.length,
//Toast.LENGTH_LONG).show();
//socket = new Socket("192.168.1.12",9843);
// in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
// out = new PrintWriter(socket.getOutputStream(), true);
// os = socket.getOutputStream();
Toast.makeText(AndroidCamera.this,
"sending.. " ,
Toast.LENGTH_LONG).show();
// System.out.println("Sending...");
// os.write(mybytearray,0,mybytearray.length);
os.write(arg0,0,arg0.length);
// InputStreamReader isReader=new InputStreamReader(socket.getInputStream());
// reader=new BufferedReader(isReader);
os.flush();
txt.setText("m in");
try{
while((message=reader.readLine())!=null){
//System.out.println("read"+message);
//Toast.makeText(getApplicationContext(),
// "in Thread" ,
// Toast.LENGTH_LONG).show();
}
}catch(Exception ex){
ex.printStackTrace();
}
Thread readerThread=new Thread(new IncomingReader());
readerThread.start();
// while((message=reader.readLine())!=null){
// message=reader.readLine();
// Toast.makeText(AndroidCamera.this,
// message ,
// Toast.LENGTH_LONG).show();
// }
// txt.setText(message);
//reader.close();
// Thread readerThread=new Thread(new IncomingReader());
// readerThread.start();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
if (socket != null){
end = System.currentTimeMillis();
Toast.makeText(AndroidCamera.this,
end-start+"\n" ,
Toast.LENGTH_LONG).show();
try {
//socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// if (os != null){
// try {
//os.close();
//} catch (IOException e) {
// TODO Auto-generated catch block
// e.printStackTrace();
//}
// }
}
// Intent intent1 =new Intent(AndroidCamera.this,response.class);
//startActivity(intent1);
camera.startPreview();
}};
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
if(previewing){
camera.stopPreview();
previewing = false;
}
if (camera != null){
try {
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
previewing = true;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera = Camera.open();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
camera.stopPreview();
camera.release();
camera = null;
previewing = false;
}
private void setUpNetworking(){
try{
socket=new Socket("192.168.1.12",6879);
Toast.makeText(AndroidCamera.this,
"called.. " ,
Toast.LENGTH_LONG).show();
InputStreamReader isReader=new InputStreamReader(socket.getInputStream());
reader=new BufferedReader(isReader);
Toast.makeText(AndroidCamera.this,
"back.. " ,
Toast.LENGTH_LONG).show();
os = socket.getOutputStream();
}
catch(IOException ex){
ex.printStackTrace();
}
}
public class IncomingReader implements Runnable{
public void run(){
String message;
try{
while((message=reader.readLine())!=null){
//System.out.println("read"+message);
Toast.makeText(getApplicationContext(),
"in Thread"+message ,
Toast.LENGTH_LONG).show();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}
}
server code-
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
public class ChatServer{
ArrayList clientOutputStreams;
BufferedWriter bw;
public class ClientHandler implements Runnable{
// BufferedReader reader;
Socket sock;
InputStream is;
// PrintWriter writer;
public ClientHandler(Socket clientSocket){
try{
sock=clientSocket;
is = sock.getInputStream();
//InputStreamReader isReader=new InputStreamReader(sock.getInputStream());
//reader=new BufferedReader(isReader);
}catch(Exception ex){
ex.printStackTrace();
}
}
public void run(){
String message;
try{
int filesize=900000; // filesize temporary hardcoded
long start = System.currentTimeMillis();
int bytesRead;
int current = 0;
byte [] mybytearray = new byte [filesize];
// writer=new PrintWriter(sock.getOutputStream(),true);
FileOutputStream fos = new FileOutputStream("source-image15.jpeg");
BufferedOutputStream bos = new BufferedOutputStream(fos);
bytesRead = is.read(mybytearray,0,mybytearray.length);
current = bytesRead;
// thanks to A. Cádiz for the bug fix
do {
bytesRead =
is.read(mybytearray, current, (mybytearray.length-current));
if(bytesRead >= 0) current += bytesRead;
} while(bytesRead > -1);
bos.write(mybytearray, 0 , current);
// bos.flush();
bos.close();
long end = System.currentTimeMillis();
tellEveryone();
System.out.println(end-start);
//
//writer.close();
System.out.println("Image Received");
}catch(Exception ex){
ex.printStackTrace();
}
finally{
if(sock!=null){
try {
sock.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.exit(0);
}
}
}
}
public static void main(String[] args){
ChatServer frame=new ChatServer();
frame.go();
}
public void go(){
clientOutputStreams=new ArrayList();
try{
ServerSocket serverSock=new ServerSocket(6879);
while(true)
{
Socket clientSocket=server开发者_JS百科Sock.accept();
//PrintWriter writer=new PrintWriter(clientSocket.getOutputStream());
OutputStream os = clientSocket.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(os);
bw = new BufferedWriter(osw);
//clientOutputStreams.add(writer);
Thread t=new Thread(new ClientHandler(clientSocket));
t.start();
System.out.println("got connection");
}
}catch(Exception ex){
ex.printStackTrace();
}
}
public void tellEveryone(){
//Iterator it=clientOutputStreams.iterator();
//while(it.hasNext())
//{
try{
//PrintWriter writer=(PrintWriter)it.next();
//writer.println("image received");
//writer.flush();
bw.write("received");
}
catch(Exception ex){
ex.printStackTrace();
}
//}
}
}
You can use the same socket connection on both the droid and the server. Just get the InputStream from your socket on the droid, and the output stream from your socket on the server. Once you have those, you can write a magic number, or text, or whatever to the socket on the server. once you call read() in the droid's socket, it will wait for that message to come through. However, you will probably want to do that in another thread because otherwise you whole app would freeze while it waits for the response from the server. Sidenote: Please get rid of commented out code before you ask your question. It really does help people trying to answer your question.
精彩评论