黑马程序员_模拟文本转换服务器

----------- Android培训Java培训Java学习型技术博客、期待与您交流! ------------

使用IO和Socket服务在本地主机模拟文本转换服务器.

 

需求分析:从客户端发送文本数据到服务器端,服务器端将文本数据转换为大写后返回给客户端,而且客户端可以不断的输入进行文本转换,当客户端输入over时,转换结束.

 

客户端:键盘录入,网络输出流和读取服务器返回的输入流

1.建立服务

2.获取键盘录入

3.将数据发送给服务端

4.获取服务器端返回的转换数据

5.结束,关闭资源.

 

->创建Socket服务,并指定要连接的主机和端口

 

class Client
 {
 	public static void main(String[] args) throws Exception
 	{
 		Socket s = new Socket("localhost", 10000);
 		
 		BufferedReader bufr = 
 			new BufferedReader(new InputStreamReader(System.in));
 		
 		BufferedWriter bufOut = 
 			new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 			
 		BufferedReader bufIn = 
 			new BufferedReader(new InputStreamReader(s.getInputStream()));
 		
 		String line = null;
 		
 		while((line = bufr.readLine()) != null)
 		{
 			if("over".equals(line))
 				break;
 				
 			bufOut.write(line);
 			
 			String str = bufIn.readLine();
 			System.out.println("Server: " + str);
 				
 		}		
 		bufr.close();
 		s.close();
 	}
 }
 

 

 

服务器:socket读取流和socket输出流

->建立服务端的socket服务,SocketServer并监听一个端口

->通过SocketServer的方法accept,获取客户端对象.

 

 

class Server
 {
 	public static void main(String[] args) throws Exception
 	{
 		ServerSocket ss = new ServerSocket(10000);
 		
 		Socket s = ss.accept();
 		String ip = s.getInetAddress().getHostAddress();
 		System.out.println(ip + ":" + " is connected");
 		
 		BufferedReader bufIn = 
 			new BufferedReader(new InputStreamReader(s.getInputStream()));
 		
 		BufferedWriter bufOut = 
 			new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 		
 		String line = null;
 		while((line = bufIn.readLine()) != null)
 		{
 			System.out.println(line);
 			bufOut.write(line.toUpperCase());
 
 		}
 		
 		s.close();
 		ss.close();
 	}
 }
 

 

 

开启两个控制台,一个作为客户端,一个作为服务器

编译后运行.问题出现

 

1.服务器等待客户端的输入,客户端输入一次后回车,服务器没有显示收到消息.但此时的客户端也在等待,无法再次输入数据.

服务器与客户端两者都在等待.唯有Ctrl+C才能停止.

-->分析源代码后,利用到缓冲区技术,但是未调用flush()方法.所以在代码中flush(),

-->结果仍为上诉情况.

2.注意到readLine()方法为阻塞式方法.何时才会返回数据?那就是遇到回车换行(\r\n)时返回.每次从键盘录入时都是将回车换行前的数据读取,接着等待读取...

所以客户端和服务器两者同时等待输入数据.

 

在readLine()方法处添加如下代码

 

客户端处

 

服务器处

 

完整代码如下:

 

import java.io.*;
import java.net.*;
 
 class Client
 {
 	public static void main(String[] args) throws Exception
 	{
 		Socket s = new Socket("localhost", 10000);
 		
 		BufferedReader bufr = 
 			new BufferedReader(new InputStreamReader(System.in));
 		
 		BufferedWriter bufOut = 
 			new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 			
 		BufferedReader bufIn = 
 			new BufferedReader(new InputStreamReader(s.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();
 		s.close();
 	}
 }
 
 class Server
 {
 	public static void main(String[] args) throws Exception
 	{
 		ServerSocket ss = new ServerSocket(10000);
 		
 		Socket s = ss.accept();
 		String ip = s.getInetAddress().getHostAddress();
 		System.out.println(ip + ":" + " is connected");
 		
 		BufferedReader bufIn = 
 			new BufferedReader(new InputStreamReader(s.getInputStream()));
 		
 		BufferedWriter bufOut = 
 			new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
 		
 		String line = null;
 		while((line = bufIn.readLine()) != null)
 		{
 			System.out.println(line);
 			bufOut.write(line.toUpperCase());
 			bufOut.newLine();
 			bufOut.flush();
 		}
 		
 		s.close();
 		ss.close();
 	}
 }

 

 

运行结果

 

 

Done..

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值