解决方案 »
- 求大牛指教,如何在软键盘弹出时 捕捉到返回键?
- android的ilbc编码问题
- 请教各位前辈:TextView中的URL超链接显示问题
- 奇思妙想,但无从下手,还望帮助
- android logcat
- Eclipse 打开xml 文件 默认是 resources 视图,如何更改?
- 一般 android 游戏 图片放哪 ?
- android 在模拟器上能采集到声音么?
- 最新安卓换开发语言?
- airtest poco
- android 客户端调用webservice,出现错误:java.lang.RuntimeException: Cannot serialize: 7
- 大牛请进,Android音视频聊天各种实现方式问题
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();
}
}
}
}
msg_socket.receive(recvPacket);收包需要放到while循环里面就可以了, 并且你发送端需要发送结束标记,接受端发现标记可以退出循环 可以保证不需要的时候 关闭udp链接。