需求:建立一个文本转换服务器。
客户端给服务端发送文本,服务端会将文本转成大写再返回给客户端。而且客户端可以不断的进行文本转换,当客户端输入over时,转换结束。
分析:
客户端:
既然是操作设备上的数据,那么就可以使用IO技术,并按照IO的操作规律来思考。
源:键盘录入:
目的:网络设备,网络输出流。
而且操作的是文本数据,可以选择字符流。
步骤:
1、建立服务;
2、获取键盘录入;
扫描二维码关注公众号,回复:
512738 查看本文章
3、将数据发给服务端;
4、获取服务端返回的大写数据;
5、结束,关闭资源。
都是文本数据,可以使用字符流进行操作,同时提高效率,加入缓冲。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class TransClient { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket=new Socket("10.1.9.34",20000); //定义读取键盘数据的流对象 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); //定义目的主机,将数据写入到socket输出流,发给服务端。 BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //定义一个socket读取流,读取服务端返回的大写信息。 BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream())); String line=null; while((line=bufr.readLine())!=null){ if("over".equals(line)) break; bufOut.write(line); bufOut.newLine();//换行 bufOut.flush();//刷新 String str=bufIn.readLine(); System.out.println("Server:"+str); } bufr.close(); socket.close(); } }
服务端:
源:socket读取流;
目的:socket输出流;
都是文本,装饰。
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TransServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket=new ServerSocket(20000); Socket socket=serverSocket.accept(); String ip=socket.getInetAddress().getHostAddress(); System.out.println(ip+"......connectted"); //源:读取socket读取流中的数据 BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream())); //目的:socket输出流将大写数据写入到socket输出流,并发送给客户端 BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line=null; while((line=bufIn.readLine())!=null){ System.out.println(line); bufOut.write(line.toUpperCase()); bufOut.newLine();//换行 bufOut.flush();//刷新 } socket.close(); serverSocket.close(); } }
运行结果为:
在此过程中,出现的问题:
现象:客户端和服务端都有阻塞式的方法(readline()),这些方法都没有读到结束标记,那么一直等待导致两端都在等待。
解决办法:是在每个出现都加入两句话:
bufOut.newLine();//换行 bufOut.flush();//刷新
有另外一直简单的写法,把BufferedWriter替换成PrintWriter,也可达到同样的效果
客户端:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class TransClient { public static void main(String[] args) throws UnknownHostException, IOException { Socket socket=new Socket("10.1.9.34",20000); //定义读取键盘数据的流对象 BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in)); //定义目的主机,将数据写入到socket输出流,发给服务端。 //BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); PrintWriter out=new PrintWriter(socket.getOutputStream()); //定义一个socket读取流,读取服务端返回的大写信息。 BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream())); String line=null; while((line=bufr.readLine())!=null){ if("over".equals(line)) break; out.println(line); // bufOut.write(line); // bufOut.newLine();//换行 // bufOut.flush();//刷新 String str=bufIn.readLine(); System.out.println("Server:"+str); } bufr.close(); socket.close(); } }
服务端:
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class TransServer { public static void main(String[] args) throws IOException { ServerSocket serverSocket=new ServerSocket(20000); Socket socket=serverSocket.accept(); String ip=socket.getInetAddress().getHostAddress(); System.out.println(ip+"......connectted"); //源:读取socket读取流中的数据 BufferedReader bufIn=new BufferedReader(new InputStreamReader(socket.getInputStream())); //目的:socket输出流将大写数据写入到socket输出流,并发送给客户端 // BufferedWriter bufOut=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); PrintWriter out=new PrintWriter(socket.getOutputStream()); String line=null; while((line=bufIn.readLine())!=null){ System.out.println(line); out.println(line); // bufOut.write(line.toUpperCase()); // bufOut.newLine();//换行 // bufOut.flush();//刷新 } socket.close(); serverSocket.close(); } }