我正在尝试修改我的android代码,它只能发送字符串。任务是让它可以传输图片。我知道有很多不同的方法可以实现这一点。但是我试过并且真的不知道为什么我的照片无法发送,尽管连接没有问题。 有人能告诉我吗?我会非常感激。 我只是一个初学者,请忘记我糟糕的编程技巧。
以下是
下面服务器的主要部分private Runnable socket_server = new Runnable(){
public void run(){
handler.post(new Runnable() {
public void run() {
test.setText("Listening...." + getMyIp());
}
});
try{
serverSocket = new ServerSocket(1234);
while (true) {
Socket client = serverSocket.accept();
handler.post(new Runnable() {
public void run() {
test.setText("Connected.");
}
});
try {
File myFile = new File ("/sdcard/DCIM/img2.jpg");
byte [] mybytearray = new byte [(int)myFile.length()];
FileInputStream fis = new FileInputStream(myFile);
BufferedInputStream bis = new BufferedInputStream(fis);
bis.read(mybytearray,0,mybytearray.length);
OutputStream os = client.getOutputStream();
os.write(mybytearray,0,mybytearray.length);
os.flush();
client.close();
test.setText("Received.");
} catch (Exception e) {
handler.post(new Runnable() {
public void run() {
test.setText("Sending erro");
}
});
}
}
}catch(IOException e){
handler.post(new Runnable() {
public void run() {
test.setText("Fail to buitl the socket");
}
});
}
}
};
这是客户的一部分
new Thread()
{
@Override
public void run() {
// TODO Auto-generated method stub
InetAddress serverAddr = null;
SocketAddress sc_add = null;
Socket socket = null;
try
{
serverAddr = InetAddress.getByName("192.168.1.105");
sc_add= new InetSocketAddress(serverAddr,1234);
socket = new Socket();
socket.connect(sc_add,2000);
File myFile = new File("/sdcard/DCIM/img2.jpg");
InputStream fis = new FileInputStream("/sdcard/DCIM/img2.jpg");
OutputStream outputStream = socket.getOutputStream();
byte [] buffer = new byte[(int)myFile.length()];
int temp = 0 ;
while((temp = fis.read(buffer)) != -1){
outputStream.write(buffer, 0, temp);
}
outputStream.flush();
socket.close();
} catch (UnknownHostException e) {
//TextView01.setText("InetAddress fail");
} catch (SocketException e) {
//TextView01.setText("fail to develop socket");
} catch(IOException e) {
//TextView01.setText("fail to sending");
}
}
}.start();
答案 0 :(得分:2)
这是你的问题:
byte [] mybytearray = new byte [(int)myFile.length()];
// ...
bis.read(mybytearray,0,mybytearray.length);
OutputStream os = client.getOutputStream();
os.write(mybytearray,0,mybytearray.length); // <- This one.
我写了一次,在这里:Working unbuffered streams
问题是,此代码假定缓冲区完全是 完整的,不一定是这种情况。。的文档 InputStream.read(byte [],int,int)表示:
从输入流读取最多 len个字节的数据到一个数组 字节。尝试读取len个字节,但更小 号码可能会被阅读。实际读取的字节数返回为 整数。 [...]
因此,不保证缓冲区已满。这个 当我们使用
OutputStream.write(byte[], int, int)
- 方法将读取字节写入输出流时,会出现问题。它的 文档内容如下:从指定的字节数组中写出[确切] len个字节 偏移到此输出流。 [...]
这是一个有效的实施方案:
byte buffer[] = new byte[1024];
int read_count = 0;
while ((read_count = input.read(buffer, 0, buffer.length)) != -1) {
output.write(buffer, 0, read_count); // Now writes the correct amount of bytes
}
此外,缓冲区不应该与整个文件一样大,因为以块的形式传输文件更有效。有关详细说明,请参阅此较旧的问题:How do you determine the ideal buffer size when using FileInputStream?