习惯了读写字符串时用PrintWriter和BufferedReaderjava
PrintWriter(BufferedWriter(OutputStreamWriter(OutputStream)))小程序
BufferedReader(InputStreamReader(InputStream))socket
这两天给别人看项目代码的时候看到程序里用了readUTF和writeUTF这两个方法,顿时从尘封的记忆中唤起DataInput和DataOutput这两个接口。好久不用,我都快把它俩给忘了。ide
项目运行的时候老是会抛出EOFException,不明白怎么回事,因而看了看JDK文档,本身写了一段小程序测试了一下,猜想readUTF方法彷佛是经过抛出EOFException来代表到达数据的末尾,如同bufferedReader.readLine()经过返回null代表到达数据的结尾同样,只是表达的方式不一样而已。所以只须要经过检查EOFException异常来结束程序便可。测试
EOFException文档中提到:this
此异常主要被数据输入流用来代表到达流的末尾。注意,其余许多输入操做返回一个特殊值表示到达流的末尾,而不是抛出异常。.net
如下是我写的测试代码:(Java6)code
服务端:server
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; public class Client { /** * @param args */ public static void main(String[] args) { Socket socket = null; DataInputStream in = null; DataOutputStream out = null; try { socket = new Socket("localhost", 10011); out = new DataOutputStream(socket.getOutputStream()); in = new DataInputStream(socket.getInputStream()); for (int i = 0; i < 100; i++) { out.writeUTF("aaa1"); out.flush(); System.out.println(in.readUTF()); } in.close(); out.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if (socket != null) { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
客户端:接口
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class Server { static class ReadTask implements Runnable { private final Socket so; public ReadTask(Socket so) { this.so = so; } @Override public void run() { DataInputStream in = null; DataOutputStream out = null; try { in = new DataInputStream(this.so.getInputStream()); out = new DataOutputStream(this.so.getOutputStream()); System.out.println("开始处理"); while (true) { String cmd = in.readUTF(); // do some work TimeUnit.MILLISECONDS.sleep(10); out.writeUTF("result -- " + cmd); } } catch (EOFException e) { System.out.println("处理完成"); } catch (IOException e1) { e1.printStackTrace(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } if (this.so != null) { try { this.so.close(); } catch (IOException e) { e.printStackTrace(); } } } } } /** * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { ExecutorService exec = Executors.newCachedThreadPool(); ServerSocket server = null; try { server = new ServerSocket(10011); System.out.println("server started"); while (true) { Socket socket = server.accept(); ReadTask task = new ReadTask(socket); exec.execute(task); } } catch (IOException e) { e.printStackTrace(); } finally { exec.shutdown(); exec.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS); if (server != null) { try { server.close(); } catch (IOException e) { e.printStackTrace(); } } } } }