急!socket传输多个图片,接收端没办法区分开各个图片
RT。
server端向client端连续发送三个图片。client端接收时,无法正确的将数据分开。
已经弄了三天了都没搞清楚。跪求各位大神指点!
发送的规则为:
server发送每个图片之前,先发即将发送图片的大小,再发图片
client接收到即将接收的图片的大小后,开始接收图片数据。当接收到的数据量等于那个大小后,不再接收,等待接收第二次的图片。
核心代码如下:
server端:
while(true)
{
Socket ClientSocket;
ClientSocket = server.accept(); //接受
reader= new BufferedReader(new InputStreamReader(ClientSocket
.getInputStream()));
writer = new PrintWriter(ClientSocket.getOutputStream());
//图片路径
String[] str=new String[3];
str[0]="C:/Users/Administrator/Desktop/bloig/3.png";
str[1]="C:/Users/Administrator/Desktop/bloig/2.png";
str[2]="C:/Users/Administrator/Desktop/bloig/1.png";
for(int i=0;i<3;i++)
{
try {
File file = new File(str[i]);
FileInputStream input = new FileInputStream(file);
//首先发送文件长度
System.out.println(file.length());
writer.println(file.length());
writer.flush();
byte[] buffer=new byte[6000];
try {
int num= input.read(buffer);
OutputStream output = ClientSocket.getOutputStream();
OutputStream sendStream = new DataOutputStream(new BufferedOutputStream(output));
while(num!=-1)
{
sendStream.write(buffer, 0,num);
sendStream.flush();
num=input.read(buffer);
}
input.close();
sendStream.flush();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
client端核心代码:
while(true)
{
if(i==3)
{
break;
}
int size=Integer.parseInt(reader.readLine());
System.out.println("即将接收的图片大小为: "+size);
try {
byte[] buffer = new byte[6000];
File file= new File(i+".jpg");
file.createNewFile();
InputStream input = socket.getInputStream();
InputStream mess=new DataInputStream(new BufferedInputStream(input));
RandomAccessFile recv = new RandomAccessFile(file,"rw");
int num = mess.read(buffer);
int RecvSize=0;
while(num!=-1&&(RecvSize<size)) //这条判断语句没有起到监测接收到的数据量的大小的作用
{
RecvSize+=num;
recv.write(buffer,0,num);
recv.skipBytes(num);
num=mess.read(buffer);
System.out.print("test: "+RecvSize);
}
recv.close();
i++;
} catch (IOException e){
// TODO Auto-generated catch block
e.printStackTrace();
}
}