楼主要实现是要代码吗?
这个........
前不久我刚写过类似的东西。
接的时候是放ByteBuffer里,取的时候再分别取(你可以先取个名字,再取length,再根据length去图片数据)。
这就是写个接受协议。
楼主要是要代码的话,再说!建议自己写,以后用起来就不会忘。
另外提醒下楼主,在socket接受数据的时候,要注意带宽,即取buffer数据的时候要注意取到的长度。
不然会丢数据
这个........
前不久我刚写过类似的东西。
接的时候是放ByteBuffer里,取的时候再分别取(你可以先取个名字,再取length,再根据length去图片数据)。
这就是写个接受协议。
楼主要是要代码的话,再说!建议自己写,以后用起来就不会忘。
另外提醒下楼主,在socket接受数据的时候,要注意带宽,即取buffer数据的时候要注意取到的长度。
不然会丢数据
byte[] temp = new byte[4096];
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
char filename[]= new char[100];
try{
int length;
while((length=in.read(temp))!= -1){
buffer.write(temp, 0, length);
System.out.println("gets: 2");
}
byte[] FileInfo = buffer.toByteArray();
byte[] ByteFileName = new byte[100];
byte[] ByteFileSize = new byte[4];
byte[] ByteFileData = null;
System.arraycopy(FileInfo, 0, ByteFileSize, 0, 4);
System.out.println("gets: 3");
System.arraycopy(FileInfo, 4, ByteFileName, 0, 100);
//System.arraycopy(FileInfo, filename.length+4, ByteFileData, 0, FileInfo.length-(filename.length+4));
String FileName = new String(ByteFileName).trim();
System.out.println("FileName is:"+FileName);
int FileSize = (ByteFileSize[0] & 0xff) | ((ByteFileSize[1] << 8) & 0xff00) // | 表示安位或
| ((ByteFileSize[2] << 24) >>> 8) | (ByteFileSize[3] << 24);
System.out.println("FileSize is:"+FileSize);
}catch(Exception e){
e.printStackTrace();
}
}
1.接收的文件名称后面带有乱码,接收的文件大小没错。
2.在服务器断开连接我才收到这些信息(我在catch后面加上finally关闭通道都没能改正)。
你这么接受数据会接受到部分数据,写的时候将分片考虑进去
就是出现这种东西,不知道是不是乱码,怎么解决啊?
while((length=in.read(temp))!= -1){
buffer.write(temp, 0, length);
System.out.println("gets: 2");
}
你这样写,只能是有数据就取出来了。
而不保证数据是不是完成
你可以利用length来保证取到的数据够整包的时候再处理。还有一个问题
你那边的具体的数据结构
struct FileName{
char name[100];//图片名称
int length;//图片大小
};
到底是名称在前还是大小在前,你解析的时候,是前4个字节作为大小,再取100个字节作为名字的
取得顺序要和发送端对上的
如果这个长度小于104你的文件名打出来就有可能出错了
有时间研究研究去。
给你个地址,之前也有人遇到过这个问题。
http://topic.csdn.net/t/20050917/20/4277180.html
at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:589)
at libcore.io.IoBridge.recvfrom(IoBridge.java:551)
at java.net.PlainSocketImpl.read(PlainSocketImpl.java:490)
at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46)
at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240)
at java.io.InputStream.read(InputStream.java:163)
at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:142)
at java.io.BufferedInputStream.read(BufferedInputStream.java:309)
at com.example.imagesocketclient.ClientThread$1.run(ClientThread.java:108)
Caused by: libcore.io.ErrnoException: recvfrom failed: ECONNRESET (Connection reset by peer)
07-22 10:31:29.362: W/System.err(5839): at libcore.io.Posix.recvfromBytes(Native Method)
07-22 10:31:29.362: W/System.err(5839): at libcore.io.Posix.recvfrom(Posix.java:131)
07-22 10:31:29.362: W/System.err(5839): at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164)
07-22 10:31:29.362: W/System.err(5839): at libcore.io.IoBridge.recvfrom(IoBridge.java:548)
07-22 10:31:29.362: W/System.err(5839): ... 7 more
07-22 10:31:29.362: D/dalvikvm(5839): threadid=16: exiting