需求:建立一个文本转换服务器,客户端可以给服务端发送文件,服务端会将文本转换成大写再返回给客户端,并且客户端可以不断地进行文本转换,当客户端输入“over”时,转换结束。
分析:客户端,既然是操作设备上的数据,那么就可以使用io技术,并按照io的操作规律来思考:
源:键盘录入
目的:网络设置
网络输出流,而且操作的是文本数据,可以选择字符流
步骤:
1.建立服务
2.获取键盘录入
3.将数据发送给服务器
4.获取服务器返回的大写数据
5.结束,关闭资源
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
public class TransClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("192.168.1.6", 10005);
// 定义读取键盘的流对象
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
// 定义目的,将数据写入到Socket输出流,发给服务端
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
// 定义一个Socket读取流,读取服务端返回的大写信息
BufferedReader bufIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String line;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line)) {
break;
}
bufw.write(line);
bufw.newLine();
bufw.flush();
System.out.println("server:" + bufIn.readLine());
}
bufr.close();
socket.close();
}
}
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 TransServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10005);
Socket accept = server.accept();
System.out.println(server.getInetAddress().getHostAddress() + "...connected");
// 源:读取Socket读取流中的数据
BufferedReader bufr = new BufferedReader(new InputStreamReader(accept.getInputStream()));
// 目的:Socket输出流,将大写数据写入到Socket输出流,并发送给客户端
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(accept.getOutputStream()));
String line;
while ((line = bufr.readLine()) != null) {
System.out.println(line);
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
accept.close();
server.close();
}
}
该例子出现的问题
现象:客户端和服务端都在莫名的等待
为什么呢?
因为客户端和服务端都有阻塞式方法,这些方法没有读到结束标记,那么就一直等,从而导致两端都在等待。
import java.io.*;
import java.net.Socket;
public class TransClient {
public static void main(String[] args) throws Exception {
Socket socket = new Socket("192.168.1.6", 10005);
// 定义读取键盘的流对象
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
// 定义一个Socket读取流,读取服务端返回的大写信息
BufferedReader bufIn = new BufferedReader(
new InputStreamReader(socket.getInputStream()));
String line;
while ((line = bufr.readLine()) != null) {
if ("over".equals(line)) {
break;
}
out.println(line);
System.out.println("server:" + bufIn.readLine());
}
bufr.close();
socket.close();
}
}
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class TransServer {
public static void main(String[] args) throws Exception {
ServerSocket server = new ServerSocket(10005);
Socket accept = server.accept();
System.out.println(server.getInetAddress().getHostAddress() + "...connected");
// 源:读取Socket读取流中的数据
BufferedReader bufr = new BufferedReader(
new InputStreamReader(accept.getInputStream()));
// 目的:Socket输出流,将大写数据写入到Socket输出流,并发送给客户端
PrintWriter out = new PrintWriter(accept.getOutputStream(), true);
String line;
while ((line = bufr.readLine()) != null) {
System.out.println(line);
out.println(line.toUpperCase());
}
accept.close();
server.close();
}
}
网友评论