服务端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class EchoServer { private ServerSocket server; public EchoServer() throws IOException { //创建服务端套接字对象 this.server = new ServerSocket(8888); System.out.println("服务器启动:"+8888+"端口监听连接请求。"); } //服务器主要的处理逻辑 public void service() { //s是否关闭服务端连接 boolean flag = true; while(flag) { Socket socket = null; try { //获取连接的客户端套接字对象 socket = server.accept(); //获取socket相关的输入流和输出流 BufferedReader reader = getReader(socket); BufferedWriter writer = getWriter(socket); //保存客户端发送的数据 String data = null; //读取客户端发送的数据 while( (data=reader.readLine()) != null ) { //当获取的信息是'bye'是,关闭流 if( "byt".equals(data) ) { flag = false; if(reader != null) { reader.close(); } if(writer != null) { writer.close(); } break; }else { System.out.println("来自客户端的数据:"+data); //回写给客户端的数据 writer.write("echo:"+data); //插入一个行分隔符,readLine()方法用来判定字符串有没有结束 writer.newLine(); //刷新缓冲区 writer.flush(); } } } catch (Exception e) { //出错则结束循环 flag = false; }finally { try { if(server != null && (!server.isClosed())) { server.close(); System.out.println("服务端关闭"); } } catch (IOException e) { e.printStackTrace(); } } } } //获取socket相关的输入流对象 private BufferedReader getReader(Socket socket) throws IOException { InputStream in = socket.getInputStream(); return new BufferedReader(new InputStreamReader(in)); } //获取socket相关的输出流对象 private BufferedWriter getWriter(Socket socket) throws IOException { OutputStream out = socket.getOutputStream(); return new BufferedWriter(new OutputStreamWriter(out)); } public static void main(String[] args) { try { new EchoServer().service(); } catch (IOException e) { e.printStackTrace(); } } }
客户端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.Socket; public class EchoClient { private Socket socket; public EchoClient() { try { //创建客户端套接字对象 this.socket = new Socket("127.0.0.1",8888); } catch (IOException e) { e.printStackTrace(); } } public void talkToServer() { System.out.println("请输入要发送给服务端的数据:"); BufferedReader localReader = null; String data = null; //获取客户端套接字相关的输入流和输出流 BufferedReader reader = getReader(socket); BufferedWriter writer = getWriter(socket); try { //创建读取用户输入的读取流 localReader = new BufferedReader(new InputStreamReader(System.in)); while((data=localReader.readLine()) != null){ //如果客户端输入的是‘bye’则关闭IO流 if("bye".equals(data)) { System.out.println("客户端关闭"); if(reader!=null) { reader.close(); } if(writer!=null) { writer.close(); } break; }else { //readLine()方法必须读取到行分隔符才返回读取 //所以传递给输入流的字符串必须包含行分隔符 System.out.println("客户端输出的数据---->\t"+data); writer.write(data); //插入一个行分隔符作为内容结束的标识 writer.newLine(); //清空缓冲区 writer.flush(); //读取服务端返回的数据 System.out.println("服务器相应的数据---->\t"+reader.readLine()); } } } catch (Exception e) { e.printStackTrace(); }finally { //关闭客户端套接字连接 try { if(socket!=null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } private BufferedReader getReader(Socket socket) { try { InputStream in = null; BufferedReader reader = null; in = socket.getInputStream(); reader = new BufferedReader(new InputStreamReader(in)); return reader; } catch (IOException e) { e.printStackTrace(); } return null; } private BufferedWriter getWriter(Socket socket) { try { OutputStream out = null; BufferedWriter writer = null; out = socket.getOutputStream(); writer = new BufferedWriter(new OutputStreamWriter(out)); return writer; } catch (IOException e) { e.printStackTrace(); } return null; } public static void main(String[] args) { new EchoClient().talkToServer(); } }