Datagrampacket的buffer问题,求助!

sjtu_julian 2014-11-17 09:25:52
while((Fs.read(buf))!=-1)   
{
DatagramPacket pack = new DatagramPacket(buf,0, buf.length, broadcastAddr,34321);
socket.send(pack);
}

上面这段代码,如果发送文件大于Buffer的话,会连续发送几个UDP包知道发送完为止吗??
...全文
227 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Birds2018 2014-11-19
  • 打赏
  • 举报
回复
recvPacket = new DatagramPacket(recvBuffer, recvBuffer.length); msg_socket.receive(recvPacket); 收包需要放到while循环里面就可以了, 并且你发送端需要发送结束标记,接受端发现标记可以退出循环 可以保证不需要的时候 关闭udp链接。
sjtu_julian 2014-11-19
  • 打赏
  • 举报
回复
引用 1 楼 birdsaction 的回复:

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);
    } 

非常感谢版主大大!!但是还有一些问题没有解决,下面是我的发送端代码
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();
			}	
	    	
	        
 

	    }  
	      
	}
}
Birds2018 2014-11-18
  • 打赏
  • 举报
回复
DatagramPacket pack = null 当然为空。
Birds2018 2014-11-18
  • 打赏
  • 举报
回复

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);
    } 

80,493

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧