需求:建立一个文本转化服务器
客户端给服务端发送文本,服务端会将文本转成大写返回给客户端,而且客户端可以不断的进行文本转换。当客户端输入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);
}