0 0

关于socket客户端不断发送图片,服务端循环接收只能收到第一张图片的问题25

 package com.cxj.socketimage;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class SocketImageClient extends Activity{

	private EditText ed_ip = null;
	private Button bt_ip;
	private Button start_button;
	private Button end_button;
	private static String HOST = "";
	private static final int PORT = 9999;
	private Socket socket = null;
	Handler handler = new Handler();
	int length = 0;
	byte[] sendBytes = null;
	OutputStream dos = null;
	InputStream fis = null;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		ed_ip = (EditText) findViewById(R.id.EditIP);
		start_button = (Button) findViewById(R.id.start_bt);
		end_button = (Button) findViewById(R.id.end_bt);
		bt_ip = (Button) findViewById(R.id.IPbutton);
		bt_ip.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View arg0) {
				HOST = ed_ip.getText().toString();
				try {
					socket = new Socket(HOST, PORT);
				} catch (IOException ex) {
					ex.printStackTrace();
					ShowDialog("login exception:" + ex.getMessage());
				}
			}
		});
		start_button.setOnClickListener(new Button.OnClickListener() {

			public void onClick(View arg0) {
				new Thread(runnable).start();
				Toast.makeText(SocketImageClient.this, "start Shot",
						Toast.LENGTH_SHORT).show();
			}
		});
		end_button.setOnClickListener(new Button.OnClickListener() {

			public void onClick(View arg0) {
				handler.removeCallbacks(runnable);
			}
		});
	}

	public void ShowDialog(String msg) {
		new AlertDialog.Builder(this).setTitle("notification").setMessage(msg)
				.setPositiveButton("ok", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
					}
				}).show();
	}

	Runnable runnable = new Runnable() {
		public void run() {
			try {
				dos = new DataOutputStream(socket.getOutputStream());
				ByteArrayOutputStream baos = new ByteArrayOutputStream();
				takeScreenShot(end_button).compress(
						Bitmap.CompressFormat.PNG, 90, baos);
				fis = new ByteArrayInputStream(baos.toByteArray());
				sendBytes = new byte[1024];
				while ((length = fis.read(sendBytes, 0, sendBytes.length)) > 0) {
					dos.write(sendBytes, 0, length);
					dos.flush();
				}
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if (dos != null)
						dos.close();
					if (fis != null)
						fis.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			handler.postDelayed(runnable, 1000);
		}
	};

	private static Bitmap takeScreenShot(View arg0) {
		View view = arg0.getRootView();
		view.setDrawingCacheEnabled(true);
		view.buildDrawingCache();
		Bitmap bitmap = view.getDrawingCache();
		return bitmap;
	}
}

 这是客户端代码

package com.cxj.SocketImageService;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;
import java.util.Enumeration;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class SocketImageService extends Activity {
	private static final int PORT = 9999;
	private Button bt;
	private TextView tv_ip;
	static ImageView im;
    static Bitmap bitmap;
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		bt = (Button) findViewById(R.id.button1);
		tv_ip = (TextView) findViewById(R.id.textIP);
		im=(ImageView)findViewById(R.id.imageView1);
		tv_ip.setText("本机IP:" + getLocalIpAddress());
		new Thread(runnable).start();
		bt.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View arg0) {
		           new Thread() {
		                public void run() {
		                    while (true) {
		                        try {
		                        	ServerSocket server = new ServerSocket(PORT);
		                        	Socket socket = server.accept();
		                            receiveFile(socket);
		                        } catch (Exception e) {
		                        }
		                    }
		                }
		            }.start();
 //启动线程运行
		    }
		});
	}
    public static void receiveFile(Socket socket) {
        byte[] inputByte = null;
        int length = 0;
        InputStream dis = null;
        try {
            try {
                dis = new DataInputStream(socket.getInputStream());
                ByteArrayOutputStream bytestream = new ByteArrayOutputStream();
                inputByte=new byte[1024];   
                while ((length = dis.read(inputByte,0,inputByte.length))>0) {	
                	bytestream.write(inputByte, 0, length);
                }
                byte[] imageData=bytestream.toByteArray();
                bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);
                im.setImageBitmap(bitmap);
                bytestream.flush();
                bytestream.close();
            } finally {
                if (dis != null)
                    dis.close();
            }
        } catch (Exception e) {

        }
    }
	public 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("WifiPreference IpAddress", ex.toString());
		}
		return null;
	}
	private Handler handler = new Handler();
    private Runnable runnable = new Runnable() {
        public void run() {
            im.postInvalidate();
            handler.postDelayed(this, 1000);// 间隔1秒
        }
    }; 
}

 

这是服务端代码

 

不知道是不是循环坚挺的问题,还是服务端在读取的时候while没跳出,阻塞了或者是其他原因。初学,请大家多多指教,不吝赐教。


问题补充:我想的是 服务端能够不断的接收到图片并且不断刷新imageview显示图片,现在服务端只能显示出第一张图片。 <br />是不是要用长链接?如果是,怎么用?最好有实例链接什么的,O(∩_∩)O谢谢

问题补充:<div class="quote_title">lzj0470 写道</div><div class="quote_div">你先测试一下,点击一下,发送一次。能不能正常。</div> <br />这个<div class="quote_title">lzj0470 写道</div><div class="quote_div">handler.postDelayed(runnable, 1000); <br />把这个去掉 <br />在所有socket没有用的时候,进行socket.close(); <br /></div> <br />handler.postDelayed(runnable, 1000); 这句话去掉imageview就不刷新了,我现在的状况是服务端只能拿到一张图片,要客户端重新连服务端才能再刷新一张图片。而我是想不关闭socket,socket不断收发,直到有一方主动close

问题补充:<div class="quote_title">lzj0470 写道</div><div class="quote_div"><pre name="code" class="java"> private static Bitmap takeScreenShot(View arg0) { 
        View view = arg0.getRootView(); 
        view.setDrawingCacheEnabled(false); 
        //view.buildDrawingCache(); 
        Bitmap bitmap = view.getDrawingCache(); 
        return bitmap; 
    }  </pre> <br /> <br />这样呢?</div> <br />还是不行饿,//view.buildDrawingCache();注释了以后点击截图就直接报错了,取消注释和以前没什么2样。
2011年11月15日 17:22

9个答案 按时间排序 按投票排序

0 0

ServerSocket server = new ServerSocket(PORT); 放在循环里面你不是得有好多个Server,试一试放在循环外面看看

2011年11月28日 21:41
0 0

while (true) {   
                                try {   
                                    ServerSocket server = new ServerSocket(PORT);   
                                    Socket socket = server.accept();   
                                    receiveFile(socket);   
                                } catch (Exception e) {   
                                }   
                            }   


猜想应该是上面这句有问题,服务器端在同一个端口建立了多个serverSocket监听,把这句放到循环的外面。

2011年11月27日 08:24
0 0

没看内容,猜测是粘包问题

2011年11月25日 19:52
0 0

循环写的不对,就是这句:
# try { 
#                 dis = new DataInputStream(socket.getInputStream()); 
#                 ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); 
#                 inputByte=new byte[1024];    
#                 while ((length = dis.read(inputByte,0,inputByte.length))>0) {     
#                     bytestream.write(inputByte, 0, length); 
#                 } 
#                 byte[] imageData=bytestream.toByteArray(); 
#                 bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); 
#                 im.setImageBitmap(bitmap); 
#                 bytestream.flush(); 
#                 bytestream.close(); 
#             }

这个while只是读了图,没有再进入读图的状态,而上一级的while循环又是重新建立socket的,客户端要再次重新连接才能发啊,所以这样肯定是不行。

最简单的是改上面这一句,我改成下面这样,不是最优化的,但大概能用。注意:没有数据接收时,会block在read那一句上面。
# try { 
#             while(true){   
#                 dis = new DataInputStream(socket.getInputStream()); 
#                 ByteArrayOutputStream bytestream = new ByteArrayOutputStream(); 
#                 inputByte=new byte[1024];    
#                 length =dis.read(inputByte,0,inputByte.length)     
#                 bytestream.write(inputByte, 0, length);  
#                 byte[] imageData=bytestream.toByteArray(); 
#                 bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length); 
#                 im.setImageBitmap(bitmap); 
#                 bytestream.flush(); 
#                 bytestream.close();
#             } 
#             }

2011年11月21日 15:59
0 0

你是怎么加载数据源的?

2011年11月17日 10:00
0 0

用长连接,你在客户端自己定义一个指令,如果收到该指令就让服务端刷新一次,不要断开连接.

2011年11月16日 20:26
0 0

 private static Bitmap takeScreenShot(View arg0) {  
        View view = arg0.getRootView();  
        view.setDrawingCacheEnabled(false);  
        //view.buildDrawingCache();  
        Bitmap bitmap = view.getDrawingCache();  
        return bitmap;  
    }  


这样呢?

2011年11月16日 10:48
0 0

你先测试一下,点击一下,发送一次。能不能正常。

2011年11月16日 00:15
0 0

handler.postDelayed(runnable, 1000);
把这个去掉
在所有socket没有用的时候,进行socket.close();

2011年11月15日 23:32

相关推荐

Global site tag (gtag.js) - Google Analytics