前面我们socket客户端发送你好a我是客户端这样的字符串给服务端,服务端接受的数据有了乱码。
你好a�����������
这是因为每次读取的字节限制。数据乱码不代表数据丢失了。
字符流
在字节流的概念里,OutputStream是输出,InputStream是输入。
字符流中,有2个抽象类分别是Reader和Writer。
抽象类派生的子类,是我们编码中需要使用的。
1、客户端
// 创建客户端
Socket client = new Socket("127.0.0.1",9000);
// 客户端准备向服务端发送数据
OutputStream outputStream = client.getOutputStream(); //获取 输出流
String msg = "我是客户端";
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);
bufferedWriter.write(msg);
bufferedWriter.close();
outputStream.close(); //关闭输出流
client.close(); //关闭客户端
2、服务端
// 服务端创建一个监听
ServerSocket serverSocket = new ServerSocket(9000);
Socket socket = serverSocket.accept(); //等待客户端接入
// 准备接受客户端发送过来的数据
InputStream inputStream = socket.getInputStream(); //获取 输入流
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String getLineStr = "";
while ((getLineStr = bufferedReader.readLine()) != null){
System.out.println(new String(getLineStr));
}
// 关闭
inputStream.close();
socket.close();
serverSocket.close();
读取本地资源文件
比如本地resources资源目录中,有一个1.txt文件,内容是n多行字符串。
改造客户端代码:
// 创建客户端
Socket client = new Socket("127.0.0.1",9000);
// 客户端准备向服务端发送数据
OutputStream outputStream = client.getOutputStream(); //获取 输出流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));
// 读取项目本地资源文件
String filePath = MyClient.class.getResource("/1.txt").getPath();
FileReader fileReader = new FileReader(filePath);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while (true){
String tmp = bufferedReader.readLine();
if (tmp == null) break;
bufferedWriter.write(tmp);
bufferedWriter.newLine();
}
bufferedWriter.close(); // 关闭就会刷新缓存区
fileReader.close();
outputStream.close(); //关闭输出流
client.close(); //关闭客户端
本文通过客户端和服务端的示例代码展示了在网络通信中如何避免出现乱码现象,介绍了字符流的概念及其在读取和发送字符串过程中的应用。
1404

被折叠的 条评论
为什么被折叠?



