试过两种情况,不管先使用字符流或者后使用字符流,这两者之间的共存都会出或多或少的问题。
解决办法是使用DataOutput和DataInput两接口中可以配对的方法-readUTF()和writeUTF()方法
这是客户端的代码Client.java:
import java.io.DataInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.Socket;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
Socket socket=new Socket("192.168.1.102",8189);
InputStream in=socket.getInputStream();
File file=new File("test.jpg");
if(file.exists())
{
file.delete();
}
FileOutputStream out=new FileOutputStream(file);
DataInputStream data=new DataInputStream(in);
String line=data.readUTF();
System.out.println("line:"+line);
byte[] b=new byte[10240];
int count=in.read(b,0,10240);
while(-1!=count)
{
out.write(b, 0, count);
out.flush();
count=in.read(b,0,10240);
}
out.close();
socket.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
这是服务器的代码Server.java:
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket server=new ServerSocket(8189);
Socket socket=server.accept();
OutputStream out=socket.getOutputStream();
DataOutputStream data=new DataOutputStream(out);
data.writeUTF("welcome buddy");
/*
PrintWriter pw=new PrintWriter(out);
pw.println("welcome");
pw.flush();
System.out.println("welcome success");
*/
//Thread.sleep(1000);
File file=new File("test.jpg");
FileInputStream in=new FileInputStream(file);
byte[] b=new byte[10240];
int count=in.read(b,0,10240);
while(-1!=count)
{
out.write(b, 0, count);
out.flush();
count=in.read(b,0,10240);
System.out.println("count:"+count);
}
/*
pw=new PrintWriter(out);
pw.println("bye");
pw.flush();
*/
System.out.println("bye success");
socket.close();
in.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}