用Android做客户端,用Java做服务端,然后在客户端进行上传图片和下载图片的操作,服务端响应对应的操作。使用socket通信。
在同一台PC上运行:
Java服务端
接收图片
//接收图片
public static void recImage(Socket socket){
try {
//获取输入流
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
File file = new File("./src/images/");
if (!file.exists()) {//判断文件是否存在
file.mkdirs();
}
//写入文件
//图片名
String filename = "/" + System.currentTimeMillis() + ".jpg";
FileOutputStream fileOutputStream = new FileOutputStream(file + filename);
byte[] bytes = new byte[inputStream.available()];
System.out.println("receive字节大小" + inputStream.available());
inputStream.read(bytes);
fileOutputStream.write(bytes);
fileOutputStream.flush();
inputStream.close();
fileOutputStream.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
发送图片
public static void sendImage(Socket socket){
try {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
FileInputStream fis = new FileInputStream("./src/images/2.jpg");
System.out.println("图片大小" + fis.available());
byte[] data = new byte[fis.available()];
fis.read(data);
dos.writeInt(fis.available());
dos.write(data);
dos.flush();
dos.close();
fis.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
主函数
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
Socket socket = serverSocket.accept();
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
String s = "";
s = dataInputStream.readUTF();
if (s.equals("1")){
recImage(socket);
}
else if (s.equals("2")){
sendImage(socket);
}
else {
System.out.println(""+s);
}
}
}
Android客户端
发送图片
new Thread() {//上传
@Override
public void run() {
try {
Socket socket = new Socket("IP地址", 8888);
if (!socket.isConnected()) {
System.out.println("连接失败");
}
System.out.println("连接成功");
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());//获取输出流
//得到要发送的图片
outputStream.writeUTF("1");
outputStream.flush();
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "dp.jpg");
//将图片文件注入输入流
FileInputStream fileInputStream = new FileInputStream(file);
System.out.println("send字节大小" + fileInputStream.available());
//得到文件的大小
byte[] data = new byte[fileInputStream.available()];
// int length = 0;
// while ((length = fileInputStream.read(data, 0, data.length))!=-1) {
// outputStream.write(data, 0, data.length);//输出
// outputStream.flush();
// }
fileInputStream.read(data);
outputStream.write(data);
outputStream.flush();
outputStream.close();
fileInputStream.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
接收图片
new Thread() {//上传
@Override
public void run() {
Socket socket = null;
try {
socket = new Socket("IP地址", 8888);
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF("2");
dataOutputStream.flush();
DataInputStream dataInput = new DataInputStream(socket.getInputStream());
int size = dataInput.readInt();
byte[] data = new byte[size];
int len = 0;
while (len < size) {
len += dataInput.read(data, len, size - len);
}
System.out.println(""+data);
//ByteArrayOutputStream outPut = new ByteArrayOutputStream();
// Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
// bmp.compress(Bitmap.CompressFormat.PNG, 100, outPut);
// imageView.setImageBitmap(bmp);
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),System.currentTimeMillis()+"receive.jpg");
FileOutputStream outputStream = new FileOutputStream(file);
outputStream.write(data);
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
服务端部署到Linux服务器上
服务器
public class server1 {
// public static void main(String[] args) throws IOException {
// ServerSocket serverSocket = new ServerSocket(8888);
// while (true){
// Socket socket = serverSocket.accept();
// DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
// String s = "";
// s = dataInputStream.readUTF();
// System.out.println(s);
// if (s.equals("1")){
// recImage(socket,System.currentTimeMillis()+".jpg");
// }
// else if (s.substring(0,1).equals("2")){
// String filename = s.substring(1);
// sendImage(socket, filename);
// }
// else {
// System.out.println(""+s);
// }
// }
// }
public static int link(int name) throws IOException {
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = serverSocket.accept();
int a=0;
while (true){
// Socket socket = serverSocket.accept();
DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
String s = "";
s = dataInputStream.readUTF();
System.out.println(s);
if (s.equals("1")){
// recImage(socket,System.currentTimeMillis()+".jpg");
recImage(socket, String.valueOf(name));
}
else if (s.substring(0,1).equals("2")){
String filename = s.substring(1);
a = sendImage(socket, filename);
System.out.println("返回值:"+a);
return a;
}
else {
System.out.println(""+s);
}
}
}
public static int sendImage(Socket socket,String filename){
String filepath = "./src/images/";
try {
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
File file = new File(filepath+"/"+filename+".jpg");
if(!file.exists()){
System.out.println("图片不存在");
// throw new FileNotFoundException();
dos.writeUTF("fail");
}
dos.writeUTF("success");
FileInputStream fis = new FileInputStream(file);
int size = fis.available();
System.out.println("size = " + size);
byte[] data = new byte[size];
fis.read(data);
dos.writeInt(size);
dos.write(data);
dos.flush();
dos.close();
fis.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return Integer.parseInt(filename);
}
public static int recImage(Socket socket,String filename){
String filepath = "./src/images/";
try {
//获取输入流
DataInputStream inputStream = new DataInputStream(socket.getInputStream());
int size = inputStream.readInt();
System.out.println("size"+size);
File file = new File("./src/images/");
if (!file.exists()) {
file.mkdirs();
}
//写入文件
// String filename = "/" + System.currentTimeMillis() + ".jpg";
FileOutputStream fileOutputStream = new FileOutputStream(file +"/"+filename+".jpg");
// byte[] bytes = new byte[inputStream.available()];
byte[] bytes = new byte[size];
System.out.println("receive字节大小" + inputStream.available());
//inputStream.available()适用于本地数据,
int len = 0;
while (len < size) {
len += inputStream.read(bytes, len, size - len);
}
// inputStream.read(bytes);
fileOutputStream.write(bytes);
fileOutputStream.flush();
inputStream.close();
fileOutputStream.close();
socket.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("filename"+filename);
return Integer.parseInt(filename);
}
}
客户端
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread() {//上传
@Override
public void run() {
try {
Socket socket = new Socket("IP地址", 8888);
if (!socket.isConnected()) {
System.out.println("连接失败");
}
System.out.println("连接成功");
DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());//获取输出流
//得到要发送的图片
outputStream.writeUTF("1");
outputStream.flush();
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), "head.jpg");
//将图片文件注入输入流
FileInputStream fileInputStream = new FileInputStream(file);
System.out.println("send字节大小" + fileInputStream.available());
//得到文件的大小
int size = fileInputStream.available();
byte[] data = new byte[size];
// int length = 0;
// while ((length = fileInputStream.read(data, 0, data.length))!=-1) {
// outputStream.write(data, 0, data.length);//输出
// outputStream.flush();
// }
fileInputStream.read(data);
outputStream.writeInt(size);
outputStream.write(data);
outputStream.flush();
outputStream.close();
fileInputStream.close();
// bout.close();
socket.close();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
});
Socket socket = null;
try {
socket = new Socket("ip地址", 8888);
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
dataOutputStream.writeUTF("2"+et.getText().toString());
dataOutputStream.flush();
DataInputStream dataInput = new DataInputStream(socket.getInputStream());
String response = dataInput.readUTF();//获取服务端返回的信息
if(response.equals("success")) {//成功
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),et.getText().toString()+".jpg");
FileOutputStream outputStream = new FileOutputStream(file);
System.out.println(response);
int size = dataInput.readInt();
byte[] data = new byte[size];
int len = 0;
while (len < size) {
len += dataInput.read(data, len, size - len);
}
System.out.println("" + data);
// ByteArrayOutputStream outPut = new ByteArrayOutputStream();
// Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);
// bmp.compress(Bitmap.CompressFormat.PNG, 100, outPut);
// imageView.setImageBitmap(bmp);
outputStream.write(data);
outputStream.flush();
outputStream.close();
}
else {
System.out.println("图片不存在");
}
dataInput.close();
dataOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
出现的问题
刚开始字节数组的大小我都用input stream.available(),在本地运行的时候都是可以的,但是用Linux服务器时发现老是接收不到数据,就算接收到了数据也是不完整的,后来发现是nputstream.available()这个方法的问题。
关于InputStream类的available()方法:
要一次读取多个字节时,经常用到InputStream.available()方法,这个方法可以在读写操作前先得知数据流里有多少个字节可以读取。需要注意的是,如果这个方法用在从本地文件读取数据时,一般不会遇到问题,但如果是用于网络操作,就经常会遇到一些麻烦。比如,Socket通讯时,对方明明发来了1000个字节,但是自己的程序调用available()方法却只得到900,或者100,甚至是0,感觉有点莫名其妙,怎么也找不到原因。其实,这是因为网络通讯往往是间断性的,一串字节往往分几批进行发送。本地程序调用available()方法有时得到0,这可能是对方还没有响应,也可能是对方已经响应了,但是数据还没有送达本地。对方发送了1000个字节给你,也许分成3批到达,这你就要调用3次available()方法才能将数据总数全部得到。
能否使用取决于实现了InputStream这个抽象类的具体子类中有没有实现available这个方法。如果实现了那么就可以取得大小,如果没有实现那么就获取不到。
int count = in.available();
byte[] b = new byte[count];
in.read(b);
在进行网络操作时往往出错,因为你调用available()方法时,对发发送的数据可能还没有到达,你得到的count是0。
需要改成这样:
int count = 0;
while (count == 0) {
count = in.available();
}
byte[] b = new byte[count];
in.read(b);
http://www.cnblogs.com/MyFavorite/archive/2010/10/19/1855758.html