/*
* 【练习】从客户端向服务端上传文本文件
*/
package UploadText;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class UploadClient {
public static void main(String[] args) throws UnknownHostException, IOException {
//1.建立客户端Socket对象
Socket s = new Socket("10.196.19.56",10006);
//2.建立读取流,用于读取待上传的文本文件内容
BufferedReader bufr = new BufferedReader(new FileReader("client.txt"));
//3.建立输出流,利用Socket特有方法获取输出流,将文件中数据输出到服务端
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
String line = null;
while((line=bufr.readLine())!=null){
out.println(line);
/*
* 【如果没有结束标记】
* 这里客户端发送一行数据给服务端(下接UploadServer中while循环)
*
* 直到客户端数据全部发送完毕(下接UploadServer中while循环)
*/
}
/*
* 【特别注意】到这里位置客户端数据发送完毕,告诉服务端,即定义结束标记,用Socket类的特有方法:
* public void shutdownOutput()throws IOException
* 用于定义结束标记告诉服务端这边客户端结束
*/
s.shutdownOutput();
//4.获取服务端反馈信息,即提示上传成功
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
String str = bufIn.readLine();//不用循环读了,一个提示信息而已,读一行即可
System.out.println(str);
//5.关闭资源
bufr.close();
s.close();
}
}
=========================分割线=============================
package UploadText;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class UploadServer {
public static void main(String[] args) throws IOException {
//1.建立服务端ServerSocket对象
ServerSocket ss = new ServerSocket(10006);
//2.通过ServerSocket类特有方法accept()获取客户端的Socket对象
Socket s = ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"connected......");
//3.读取客户端发来的数据
BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));
//由于客户端发来的是用字节流读取的文本数据,那么这里用转换流InputStreamReader将字节数据转为字符数据
//4.将上一步读取到的数据写到服务端文本文件中
BufferedWriter bufw = new BufferedWriter(new FileWriter("server.txt"));
String line = null;
while((line=bufIn.readLine())!=null){//先读取客户端的数据
bufw.write(line);//再写到服务端文件中
bufw.newLine();//每写一行数据,换行一次
/*
* 【如果没有结束标记】
* (上接UploadClient中while循环)这里接收一行数据
*
* (上接UploadClient中while循环)这里服务端还在等客户端数据,不知道客户端已经发完,所以readLine()阻塞,程序卡住不动
*/
bufw.flush();
//由于接收到了客户端shutdownOutput()发来的结束标记,这里while循环结束
}
//5.上传完毕后,将“上传完成”信息反馈给客户端
PrintWriter out = new PrintWriter(s.getOutputStream(),true);
out.println("上传成功");
//6.关闭资源
bufw.close();
s.close();
ss.close();
}
}