TCP基础(二)

本文详细介绍了如何实现一个文本转化服务器,客户端通过键盘输入文本,服务端接收并将其转化为大写返回给客户端,同时提供了对不同文本的连续转换功能。通过引入IO技术,实现文本数据的高效传输。此外,还探讨了使用PrintWriter流简化代码的方法,提高了程序的可读性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:建立一个文本转化服务器
客户端给服务端发送文本,服务端会将文本转成大写返回给客户端,而且客户端可以不断的进行文本转换。当客户端输入over时,转换结束。

客户端

/*
既然是操作设备上的数据,那么可以使用IO技术,并按照IO的操作规律思考
源:键盘录入
目的: 网络设备,网络输出流。而且操作的是文本数据,可以选择字符流
 * */
package com.ifeng.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

public class InputByKeyboarClient
{
	public static void main(String[] args)
	{
		BufferedReader bufr = null;
		Socket socket = null;		
		try
		{
			socket = new Socket("192.168.1.100",9000);
			//定义读取键盘输入的流对象
			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 msgFromSer = bufin.readLine();
				System.out.println("From Server: "+msgFromSer);
			}
			
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			try
			{
				if(bufr != null)
					bufr.close();
			}
			catch(Exception e){e.printStackTrace();}
			try
			{
				if(socket != null)
					socket.close();
			}
			catch(Exception e){e.printStackTrace();}
		}		
	}
}

服务器端

package com.ifeng.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class InputByKeyboardServer
{
	public static void main(String[] args)
	{
		ServerSocket serSocket = null;
		Socket socket = null;
		try
		{
			serSocket = new ServerSocket(9000);
			socket = serSocket.accept();
			//显示是哪一台客户端连接了服务器
			String ip = socket.getInetAddress().getHostName();
			System.out.println(ip+"...Connected.");
			BufferedReader bufin =
					new BufferedReader(new InputStreamReader(socket.getInputStream()));
			BufferedWriter bufout =
					new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
			String line = null;			
			while((line = bufin.readLine())!= null)
			{
				bufout.write(line.toUpperCase());
				bufout.newLine();
				bufout.flush();
			}
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		finally
		{
			
			try
			{
				if(socket != null)
					socket.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
			try
			{
				if(serSocket != null)
					serSocket.close();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		
		}
		
	}
}

对于上面例子中使用到的BufferedWriter流,可以使用PrintWriter流来替换,代码更简洁

例如:

//BufferedWriter bufout = 
				//new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
		//可以使用PrintWriter来替换上面的BufferedWriter
		//传递true参数后可以自动刷新,所以可以省略下面的flush()方法
		PrintWriter out = new PrintWriter(s.getOutputStream(),true);
		
		//定义一个Socket读取流,用来读取服务器返回的大写信息
		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();
			out.println(line);
			String msgfromServer = bufin.readLine();
			System.out.println("FromServer: "+msgfromServer);
		}


 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值