解决方案 »

  1.   


    while((Fs.read(buf))!=-1)   
        {
            DatagramPacket pack = new DatagramPacket(buf,0, buf.length, broadcastAddr,34321); 
            socket.send(pack);
        } 
    修改成:
    int n = -1;
     DatagramPacket pack = new DatagramPacket(buf,0, buf.length, broadcastAddr,34321); 
    while((n = Fs.read(buf))!=-1)   
        { 
           pack = new DatagramPacket(buf,0, n, broadcastAddr,34321); 
            socket.send(pack);
        } 
      

  2.   

    DatagramPacket pack = null 当然为空。
      

  3.   


    非常感谢版主大大!!但是还有一些问题没有解决,下面是我的发送端代码
    package udpsss1;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;public class udp_server {
    public static void main(String[] args) throws Exception{

    boolean stop=true;
    DatagramSocket socket=new DatagramSocket(34321);
    File df =new File("C:\\3.png");
    FileInputStream Fs=new FileInputStream(df);
    while(stop){
    byte buf[]=new byte[8192];
    /*byte[] data=new byte[Fs.available()];//新建一个字节数组
                Fs.read(data);//将文件中的内容读取到字节数组中
    */             InetAddress broadcastAddr;//将目标地址设为广播地址
             broadcastAddr = InetAddress.getByName("255.255.255.255"); //广播地址
             System.out.println("start!");
             int n = -1;
              DatagramPacket pack = new DatagramPacket(buf,0, buf.length, broadcastAddr,34321); 
             while((n = Fs.read(buf))!=-1)   
                 { 
                    pack = new DatagramPacket(buf,0, n, broadcastAddr,34321); 
                     socket.send(pack);
                 } 
           stop=false;         
    }
    System.out.println("end!");
    socket.close();
     Fs.close();
    }}
    现在的情况是我发送一个1K大小的图片,Android客户端能接收到UDP包并显示,但是我发送稍大一点的图片就不行了,所以我猜测是因为大一点的图片用了不止一个UDP包发送,而我在接收端只接收了第一个UDP包。因此我想知道,我的发送端代码是不是会把大图片分成几个UDP包?
    另外当我发送大图片是可以确定的是,接收端确实接收到了UDP包(在handler中设置了一个settext,若未接受到UDP包,它不会显示),但是却无法显示接受的图片。如果确实发送端发送了不止一个UDP包,我在接收端应该怎么循环接收呢?
    以下是我的接收端代码:
    package com.example.udpreceiver1;import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.SocketException;
    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.os.StrictMode;
    import android.util.Log;
    import android.view.KeyEvent;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;public class MainActivity extends Activity {


    private Handler handler=new Handler(){  
            public void handleMessage(Message msg){  
                    if(msg.what==IS_FINISH){
                     byte[] data=(byte[])msg.obj;
                     Bitmap bmp=BitmapFactory.decodeByteArray(data, 0, data.length);
                     imageview.setImageBitmap(bmp);
                     view.setText("dfg");
                    }
            
            }  
        };
        private TextView view;
        Button button;
        ImageView imageview;
        private Bitmap photo;
        private static int IS_FINISH = 1;
    @Override
    public
     void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
            view = (TextView)findViewById(R.id.view);
            button=(Button)findViewById(R.id.button);
            imageview=(ImageView)findViewById(R.id.imageView);
            button.setOnClickListener(new Button.OnClickListener() {  
                
                @Override  
                public void onClick(View v) {  
                    // TODO Auto-generated method stub  
                 ThreadTest threadTest=new ThreadTest();  
                    new Thread(threadTest).start(); 
                }  
            });     
            }

    private class ThreadTest implements Runnable{  
    byte[] recvBuffer = null;
        int MSG_LEN = 8192;
        DatagramPacket recvPacket;
        public void run() {  
         try {
    DatagramSocket msg_socket =new DatagramSocket(34321);
    recvBuffer = new byte[MSG_LEN]; recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length);
    msg_socket.receive(recvPacket);

           Message msgMessage=Message.obtain();  
          
            msgMessage.obj = recvPacket.getData();
            
            msgMessage.what = IS_FINISH;
            handler.sendMessage(msgMessage); 

    } catch (SocketException e) {
    //Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
    e.printStackTrace();
    } catch (IOException e) {
    //Toast.makeText(MainActivity.this, e.toString(), Toast.LENGTH_LONG).show();
    e.printStackTrace();
    }
        
            
          }  
          
    }
    }
      

  4.   

    recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length);
                    msg_socket.receive(recvPacket);收包需要放到while循环里面就可以了, 并且你发送端需要发送结束标记,接受端发现标记可以退出循环 可以保证不需要的时候 关闭udp链接。