现在是终端之间发送图片,类似微信之间发送图片那样,客户端把图片转化为字节流发给服务器上,然后服务器再找到要发送的人,把数据发给另外终端设备。现在在局域网两台模拟器上发送大图片,发送接收都没问题,部署到外网服务器上,服务器接收代码: int length = 0;
int totalNum = 0;
byte[] buffer = new byte[1024];
while ((length = dis.readInt()) != 0) {
length = dis.read(buffer, 0, length);
System.out.println("length :-------->" + length); totalNum += length;
out.writeInt(length);
out.write(buffer, 0, length);
out.flush();
}
System.out.println("totalNum:-------->" + totalNum);
out.writeInt(0);
out.flush();
Debug.info("totalNum::::" + totalNum);
initService.getEnterpriseMsgService().save(msg);
每次接收1024个字节,有时候到System.out.println("length :-------->" + length);----直接为null,模拟器上每次发送和接收的数据是一致的,发送大图片就没这个问题。各位大神,求解决方案,是代码的问题,还是服务器的问题(公司的一台PC机,很卡的那种)
int totalNum = 0;
byte[] buffer = new byte[1024];
while ((length = dis.readInt()) != 0) {
length = dis.read(buffer, 0, length);
System.out.println("length :-------->" + length); totalNum += length;
out.writeInt(length);
out.write(buffer, 0, length);
out.flush();
}
System.out.println("totalNum:-------->" + totalNum);
out.writeInt(0);
out.flush();
Debug.info("totalNum::::" + totalNum);
initService.getEnterpriseMsgService().save(msg);
每次接收1024个字节,有时候到System.out.println("length :-------->" + length);----直接为null,模拟器上每次发送和接收的数据是一致的,发送大图片就没这个问题。各位大神,求解决方案,是代码的问题,还是服务器的问题(公司的一台PC机,很卡的那种)
我知道原因,我也遇到过,,,,1024 太大了,如果图片小于1024 你就直接读到后面的了。size是文件的大小。
byte[] buffer;
if (size > 1024)
buffer = new byte[1024];
else
buffer = new byte[size];
throws FileNotFoundException, IOException {
Log.i(TAG, "readFileSendData filePath=" + filePath);
DataInputStream ddis = new DataInputStream(
new FileInputStream(filePath));
Log.i(TAG, "ddis =" + ddis);
int length = 0;
int totalNum = 0;
byte[] buffer = new byte[1024];// 每次上传的大小
Log.i(TAG, "img.avaliable=" + ddis.available()); while ((length = ddis.read(buffer)) != -1) {
totalNum += length;
Log.i(TAG, "length=" + length);
dos.writeInt(length);
dos.write(buffer, 0, length);
dos.flush();
} dos.writeInt(0);
dos.flush(); if (ddis != null) {
ddis.close();
ddis = null;
}
Log.i(TAG, "readFileSendData(): send bytes=" + totalNum);
}
-------------------服务器中转:
SessionSocket sessionSocket = getSessions(receiveId);
if (null != sessionSocket) {
Socket socket = sessionSocket.getSocket();
Debug.info("找到了对方");
// saveMessage(message,null);
DataOutputStream out = new DataOutputStream(socket
.getOutputStream());
out.writeInt(procotol);
out.writeInt(sendId);
out.writeInt(receiveId);
out.writeUTF(TimeUtil.getAbsoluteTime());
out.flush(); int length = 0;
int totalNum = 0;
byte[] buffer = new byte[1024];
while ((length = dis.readInt()) != 0) {
length = dis.read(buffer, 0, length);
System.out.println("length:-------->" + length);
totalNum += length;
out.writeInt(length);
out.write(buffer, 0, length);
out.flush();
}
out.writeInt(0);
out.flush();
Debug.info("totalNum::::" + totalNum);
initService.getEnterpriseMsgService().save(msg); } else {// 保存该信息到数据库
Debug.info("没有找到对方");
// saveMessage(message,1);
initService.getEnterpriseMsgService().save(msg); }
} catch (IOException e) {
e.printStackTrace();
}-------------------
客户端接收:private void receiveDataWriteFile(String filePath)
throws FileNotFoundException, IOException {
Log.i(TAG, "receiveDataWriteFile(): filePath=" + filePath);
DataOutputStream ddos = new DataOutputStream(new FileOutputStream(
filePath)); // 将语音或图片写入本地SD卡
Log.i(TAG, "receiveDataWriteFile(): ddos=" + ddos);
int length = 0;
int totalNum = 0;
byte[] buffer = new byte[1024];
Log.i(TAG, "receiveDataWriteFile() 开始接收数据...");
while ((length = dis.readInt()) != 0) {
Log.i("receiveDataWriteFile()", "length:" + length);
length = dis.read(buffer, 0, length);
totalNum += length;
ddos.write(buffer, 0, length);
ddos.flush();
} if (ddos != null) {
try {
ddos.close();
ddos = null;
} catch (IOException e) {
e.printStackTrace();
}
} Log.i(TAG, "receiveDataWriteFile(): receive bytes=" + totalNum);
}
另外,你中间插入的int几乎没有作用,且可能读到buffer里面去,建议不要。
发送端先把总长传过去,然后一直送
totalNum = 文件长;
dos.writeInt(totalNum);
while (totalNum > 0) {
length = ddis.read(buffer);
dos.write(buffer, 0, length);
dos.flush();
totalNum -= length;
}
接收端确定总长后,一直读,直到整个文件传送结束。
totalNum = dis.readInt();
while (totalNum > 0) {
length = dis.read(buffer, 0, 1024);
if(length > 0)
{
ddos.write(buffer, 0, length);
ddos.flush();
totalNum -= length;
}
}
Java我刚学,因为以前做C++,对socket比较熟,忍不住插嘴.其实Java的DataOutputStream等类已经用流的概念对socket作了封装,我还大谈用流的概念编程,惭愧.
因为你不一定刚好来的数据就是你的头,可能刚好起点位置是在图片数据中某段4个字节为0的地方,那么这时候就不会正常执行下去。如果你希望1K,1K地将数据从一端转发到另一端,完全不需要这么写。可以在服务器端,通过标识变量来记录就可以了。比如
int blockLength=0;
int buffLength = 1024;
int receivedLength =0;
byte[] buffer = new byte[buffLength];
int startPos = 0;
while((length = dis.read(buffer, startPos, buffLength-startPos)) > 0){
if(startPos+length == buffLength){
// a block is full, send it to client
startPos = 0; // reset startPos
}
else{
startPos += length;
}
}
byte[] buffer = new byte[4096];试一下这个方法:
InputStream is //your InputStream
OutputStream out //your OutputStream
byte[] buffer = new byte[1024];
int length = 0;
try {
while ((length = is.read(buffer)) > 0) {
out.write(buffer, 0, length);
}} catch (Exception e) {
// TODO: handle exception
}