A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

package networkprogramming;
/*
文件上传。
注意:上传完,还需要给个结束标记。
*/
import java.io.*;
import java.net.*;
class TextClient {
public static void main(String[] args) throws Exception {
  Socket s = new Socket("192.168.0.100", 10006);
  BufferedReader br = new BufferedReader(new FileReader("IPDemo.java"));
  // long time = System.currentTimeMillis();
  // DataOutputStream dos = new DataOutputStream(s.getOutputStream());
  // dos.writeLong(time);
  PrintWriter out = new PrintWriter(s.getOutputStream(), true);
  String line = null;
  while ((line = br.readLine()) != null) {
   out.println(line);
  }
  s.shutdownOutput(); // 关闭输出流,相当于给流中加入一个结束标记-1。
  // dos.writeLong(time);
  BufferedReader bufIn = new BufferedReader(new InputStreamReader(
    s.getInputStream()));
  String str = bufIn.readLine();
  System.out.println(str);
  // dos.close();
  br.close();
  s.close();
}
}
class TextServer {
public static void main(String[] args) throws Exception {
  ServerSocket ss = new ServerSocket(10006);
  Socket s = ss.accept();
  // DataInputStream dis = new DataIputStream(s.getInputStream());
  // long overTime = dis.readLong();
  BufferedReader bufIn = new BufferedReader(new InputStreamReader(
    s.getInputStream()));
  PrintWriter out = new PrintWriter(new FileWriter("server.txt"), true);
  String line = null;
  while ((line = bufIn.readLine()) != null) {
   // if(overTmie.toString().equals(line))
   // break;
   out.println(line);
  }
  PrintWriter pw = new PrintWriter(s.getOutputStream(), true);
  pw.println("上传成功");
  // dis.close();
  out.close();
  s.close();
  ss.close();
}
}
我想问下在使用 s.shutdownOutput(); 之前,老师说的先传一个结束标记(基本是我注释掉那些代码)。这个结束标记是 long 的,要真像这代码这样写下去,在服务器中怎么读取并判断这个结束标记啊?希望能给想法,能给完整代码更好了。

评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

1 个回复

倒序浏览
毕老师在视频里面也说了,为了避免那个结束标记有可能在所操作的数据中存在而导致数据处理被中断,需定义一个唯一的标记,而时间点是唯一的。看以上代码可知,那个时间点是先于客户端处理文件数据而传到服务器端的,于是在服务器端就有了这个时间点的标记。时间是long类型的,DataOutputStream 和DataInputStream 是专门处理基本数据类型的流保证了时间点的精确性。其实它们底层操作的还应该是字节流,客户端程序中调用特定流(即专门处理基本数据类型的流)特有方法writeLong()写入流中,在服务端程序中同样用特定流(专门处理基本数据类型的流)来接收时间点并在第一次while循环读到if语句的时候被转换成一行时间点字符串标记。客户端程序中待文件数据处理完后再次将时间点以特定流写到流中同样被特定流读取后,同理被转换成时间点字符串标记(此时这个标记应该是读取的line)。与之前的时间点字符串equals一下,两者内容相同符合if的要求就break了,即关闭了服务器端的读取流,程序向下执行。——我是这样理解的,也可能有不足之处。

评分

参与人数 1技术分 +1 黑马币 +5 收起 理由
乔兵 + 1 + 5

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马