package cn.itcast_12;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/*
* 服务器输出文本文件
*/
public class UploadServer {
public static void main(String[] args) throws IOException {
// 创建服务器Socket对象
ServerSocket ss = new ServerSocket(11111);

// 监听客户端链接
Socket s = ss.accept();

// 封装通道内流
BufferedReader br = new BufferedReader(new InputStreamReader(
s.getInputStream()));
// 封装文本文件
BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));

String line = null;
while ((line = br.readLine()) != null) {
// if ("over".equals(line)) {
// break;
// }

bw.write(line);
bw.newLine();
bw.flush();
}

// 给出反馈
BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));
bwServer.write("文件上传成功");
bwServer.newLine();
bwServer.flush();

// 释放资源
bw.close();
s.close();
}
}


package cn.itcast_12;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/*
* 按照我们正常的思路加入反馈信息,结果却没反应。为什么呢?
* 读取文本文件是可以null作为结束信息的,但是呢,通道内是不能这样结束信息的。
* 把以,报务器根本就不知道你结束了。而你还想服务器给你馈。所以,就相互等待了。
*
* 如何解决呢?
* A:在多写一条数据,告诉服务器,读取到这条数据说明我就结束,你也结束吧。
* 这样做可以解决问题,但是不好
* B:Socket对象提供了一种解决方案
* public void shutdownOutput():禁用此套接字的输出流。
*/
public class UploadClient {
public static void main(String[] args) throws IOException {
// 创建客户端Socket对象
Socket s = new Socket("192.168.31.165", 11111);

// 封装文本文件
BufferedReader br = new BufferedReader(new FileReader(
"InetAddressDemo.java"));
// 封装通道内流
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
s.getOutputStream()));

String line = null;
while ((line = br.readLine()) != null) {
bw.write(line);
bw.newLine();
bw.flush();
}

// 自定义结束标记
// bw.write("over");
// bw.newLine();
// bw.flush();

// Socket提供了一个终止,它会通知服务器你别等了,我没有数据过来了
s.shutdownOutput();

// 接收反馈
BufferedReader brClient = new BufferedReader(new InputStreamReader(
s.getInputStream()));
String client = brClient.readLine();
System.out.println(client);

// 释放资源
br.close();
s.close();
}
}