Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在同一套接字中使用BufferedReader接收字符串消息,并使用DataInputStream接收图像_Android_Sockets_Bufferedreader_Datainputstream - Fatal编程技术网

Android 在同一套接字中使用BufferedReader接收字符串消息,并使用DataInputStream接收图像

Android 在同一套接字中使用BufferedReader接收字符串消息,并使用DataInputStream接收图像,android,sockets,bufferedreader,datainputstream,Android,Sockets,Bufferedreader,Datainputstream,我有两个项目,一个使用BufferedReader读取字符串消息,另一个使用DataInputStream读取图像。我想合并这两个项目以从同一个套接字接收消息和图像,但我不知道如何做,因为我面临冲突。任何指导都将不胜感激 这是我的密码: //用于接收消息的类 messageReceiver类实现可运行{ @凌驾 公开募捐{ 而(s.断开连接()){ 试一试{ isr=新的InputStreamReader(s.getInputStream()); br=新的缓冲读取器(isr); mesg=br

我有两个项目,一个使用
BufferedReader
读取字符串消息,另一个使用
DataInputStream
读取图像。我想合并这两个项目以从同一个套接字接收消息和图像,但我不知道如何做,因为我面临冲突。任何指导都将不胜感激

这是我的密码:

//用于接收消息的类
messageReceiver类实现可运行{
@凌驾
公开募捐{
而(s.断开连接()){
试一试{
isr=新的InputStreamReader(s.getInputStream());
br=新的缓冲读取器(isr);
mesg=br.readLine();
mn.rununuithread(新的Runnable(){
公开募捐{
Toast.makeText(mn,“消息:+mesg,Toast.LENGTH_LONG).show();
}
});
}
捕获(IOE异常){
e、 printStackTrace();
}
}
}
}
//此类用于读取字节数组并将其转换为图像
类imageReceiver实现可运行{
位图;
主要活性锰;
数据输入流dis;
字节[]数据;
公共图像接收器(主活动mn){
这个.mn=mn;
}
公共整数byteArrayToInt(字节[]b){
最终ByteBuffer bb=ByteBuffer.wrap(b);
bb.order(ByteOrder.LITTLE_ENDIAN);
返回bb.getInt();
}
公共Uri getImageUri(文本中的上下文,图像中的位图){
ByteArrayOutputStream字节=新建ByteArrayOutputStream();
压缩(Bitmap.CompressFormat.PNG,100,字节);
字符串路径=MediaStore.Images.Media.insertImage(inContext.getContentResolver(),inImage,“123”+Math.random(),null);
返回Uri.parse(路径);
}
@凌驾
公开募捐{
而(s.断开连接()){
试一试{
InputStream in=s.getInputStream();
dis=新数据输入流(in);
字节[]readMsgLen=新字节[4];
dis.read(readMsgLen,0,4);
最终整数长度=byteArrayToInt(readMsgLen);
数据=新字节[长度];
dis.readfull(数据,0,数据长度);
位图=位图工厂.decodeByteArray(数据,0,数据.length);
mn.rununuithread(新的Runnable(){
@凌驾
公开募捐{
Toast.makeText(mn.getApplicationContext(),“接收到的图像长度:”+length,Toast.length_SHORT).show();
如果(位图==null){
Toast.makeText(mn.getApplicationContext(),“未收到图像”,Toast.LENGTH\u SHORT.show();
}
否则{
Toast.makeText(mn.getApplicationContext(),“接收到图像”,Toast.LENGTH\u SHORT.show();
毕加索
.load(getImageUri(mn,位图))
.fit()
//.centerCrop()
。加入(第四章);
}
}
});
}
捕获(IOE异常){
e、 printStackTrace();
}
}
}
}

您的
消息接收器
误用了
BufferedReader
。通过在每次循环迭代中创建一个新的
BufferedReader
,您将丢弃已经从套接字读取到读卡器内部缓冲区但代码尚未读取的任何字节。为了避免这种损失,您需要在进入循环之前创建
BufferedReader
。您的
imageReceiver
没有这个问题,因为它没有使用任何缓冲I/O

但是,当与多个操作共享一个
InputStream
时,在一个操作中完成的任何缓冲都将最终读取另一个操作所需的字节。这就是为什么当您试图将项目合并在一起时会遇到问题的原因。您的
BufferedReader
正在读取
DataInputStream
所需的字节。您需要将缓冲区移近套接字,然后为两个操作重用相同的缓冲区

尝试类似以下内容:

sockets=。。。;
...
//类以接收消息和图像
类mergedReceiver实现可运行的{
主要活性锰;
缓冲数据流bis;
字符串readLine()引发IOException{
ByteArrayOutputStream字节=新建ByteArrayOutputStream();
做{
int b=双读();
如果(b==-1)
抛出新IOException();
如果(b==0x0D)
{
二.马克(1);
b=二读();
二、重置();
如果(b==-1)
抛出新IOException();
如果(b==0x0A)
打破
字节。写入(0x0D);
}
else if(b==0x0A)
打破
字节。写入(b);
}
虽然(正确);
返回bytes.toString();
}
位图readImage()引发IOException{
DataInputStream dis=新的DataInputStream(bis);
//注意:多字节整数最常被发送
//使用big-endian进行网络通信!
//最终整数长度=dis.readInt();
字节[]lenBytes=新字节[4];
dis.readFully(lenBytes,0,4);
final ByteBuffer bb=ByteBuffer.wrap(lenBytes);
bb.order(ByteOrder.LITTLE_ENDIAN);
最终整数长度=bb.getInt();
字节[]数据=新字节[长度];
dis.readFully(数据,0,长度);
返回BitmapFactory.decodeByteArray(数据,0,长度);
}
公共合并接收器(主活动mn)