客户端:数据来自于文本文件,接受服务器反馈
服务器:接受到的数据写入文本文件,给出反馈
出现的问题:程序一直等待
原因:读数据的方法是阻塞式的
解决方法:自定义结束标记,使用shutdownOutput()方法
ClientDemo.class
import java.io.*;
import java.net.Socket;
//客户端:数据来源于文本文件
public class ClientDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket("192.168.157.1",10000);
//封装文本文件的数据
BufferedReader br = new BufferedReader(new FileReader("hmceshi\\InetDemo.java"));
//封装输出流写数据
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
String line;
while((line = br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
// //自定义结束标记,但下面3行会导致复制的文件中出现“886”字符,就会结束,所以一般不用
// bw.write("886");
// bw.newLine();
// bw.flush();
//shutdownOutput作为结束传输标记取代上面的自定义标记
s.shutdownOutput();
//接受反馈
BufferedReader brClient = new BufferedReader(new InputStreamReader(s.getInputStream()));
String data = brClient.readLine();
System.out.println("服务器的反馈"+data);
br.close();
s.close();
}
}
ServerDemo.class
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
//服务器:将加收到的信息写入文本文件
public class ServerDemo {
public static void main(String[] args) throws IOException {
//创建服务器Socket对象
ServerSocket ss = new ServerSocket(10000);
//监听客户端的链接,返回一个对应的Socket对象
Socket s = ss.accept();
//获取输入流
BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
//将数据写入文本文件
BufferedWriter bw = new BufferedWriter(new FileWriter("hmceshi\\Copy.java"));
String line;
while ((line = br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();
}
//给出反馈
BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();
bw.close();
ss.close();
}
}
学习笔记,来自B站的黑马程序员。黑马程序员全套Java教程_Java基础入门视频教程,零基础小白自学Java必备教程_哔哩哔哩_bilibili