客户端服务端交互(TCP) java
需求:建立客户端与服务端,客户端从键盘输入字符串到服务端,服务端向客户端返回字符串的大写形式。
在开始写代码之前,我要先给大家温习一下IO流中缓存区的flush()方法。如下图,服务要向客户端发送数据,为了高效地传输数据,输出流中会有一个缓冲区,而只有缓冲区被填满时,缓冲区才向客户端发送数据,若没有填满,则会一直等待被填满。但是如果我们要传输的数据就是不能把缓冲区填满的,那怎么办呢?这时就体现出flush()方法的重要性,该方法会强制将缓冲区中的数据传输到目的地。
1.客户端
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) throws UnknownHostException, IOException { System.out.print("客户端启动"); Socket s=new Socket("10.192.9.100",10006); //创建从键盘录入的读入流 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); //创建从内存到socket流中的输出流 BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); //创建从socket流到内存的读入流 BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=null; while((line=bufr.readLine())!=null) { if(line.equals("over")) break; //如果没有\r\n的话,服务器端的while中的readLine()就会一直等待转行符而不进行下面的程序 out.write(line+"\r\n"); //如果不刷新的话,由于缓冲区没有被填满,因此不会发送数据 out.flush(); String upperStr=bufIn.readLine(); System.out.print(upperStr); } s.close(); } }
2.服务端
由于服务端中的注意事项和客户端是一样的,就不再注释了
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) throws IOException { System.out.print("服务端启动"); ServerSocket ss=new ServerSocket(10006); Socket s=ss.accept(); BufferedReader bufIn=new BufferedReader(new InputStreamReader(s.getInputStream())); //PrintWriter out = new PrintWriter(s.getOutputStream(),true); BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String line=null; while((line=bufIn.readLine())!=null) { System.out.print(line); out.write(line.toUpperCase()+"\r\n"); out.flush(); } s.close(); ss.close(); } }