TCP实现多用户上传文件:
需要同时给多用户上传文件,这样就得用多线程来实现。
实际上,这样的话,上传的先后顺序和速度就跟客户端的带宽有关:带宽够,就容易抢占到线程的执行权;
首先,创建个线程类:(这个线程类执行的是服务器的功能)
线程类代码:
1 public class UserThread implements Runnable { 2 3 // 构造方法接收对象 4 private Socket s; 5 6 public UserThread(Socket s) { 7 this.s = s; 8 } 9 10 public void run() { 11 // 把客户端的代码复制过来 12 // 不同的客户端传递文件,就看他们各自的带宽情况,抢占线程 13 try { 14 // 把通道内的字节流包装成字符流 15 BufferedReader br = new BufferedReader(new InputStreamReader( 16 s.getInputStream())); 17 18 // 封装文件目录 19 // BufferedWriter bw = new BufferedWriter(new 20 // FileWriter("TCPto.txt")); 21 22 // 因为上传多个文件,所以文件名字要改变 23 String newname = System.currentTimeMillis() + ".txt"; 24 BufferedWriter bw = new BufferedWriter(new FileWriter(newname)); 25 26 // 获取数据,并输出到文件中 27 String line = null; 28 while ((line = br.readLine()) != null) { 29 bw.write(line); 30 bw.newLine(); 31 bw.flush(); 32 } 33 34 // 给出反馈 35 BufferedWriter bwr = new BufferedWriter(new OutputStreamWriter( 36 s.getOutputStream())); 37 bwr.write("你的文件上传成功!"); 38 bwr.newLine(); 39 bwr.flush(); 40 41 // 释放资源 42 s.close(); 43 bw.close(); 44 45 } catch (IOException e) { 46 e.printStackTrace(); 47 } 48 } 49 50 }
服务器的代码:
1 public class ServerDemo { 2 public static void main(String[] args) throws IOException { 3 4 // 创建ServerSocket对象,监听 5 ServerSocket ss = new ServerSocket(10010); 6 7 //有客户端上传数据就执行 8 while(true){ 9 //创建Socket对象 10 Socket s = ss.accept(); 11 //执行线程 12 new Thread(new UserThread(s)).start(); 13 14 } 15 } 16 }
客户端的代码:(只改动名字那里,目前只能这样改。。。)
1 public class ClientDemo { 2 public static void main(String[] args) throws IOException { 3 4 // 创建Socket对象 5 Socket s = new Socket("172.19.12.233", 10010); 6 7 // 封装文件目录 8 BufferedReader br = new BufferedReader(new FileReader( 9 "InetAddressDemo.java")); 10 11 // 把通道内的字节流包装成字符流 12 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 13 s.getOutputStream())); 14 15 // 获取文件中的数据,并输出给服务器 16 String line = null; 17 while ((line = br.readLine()) != null) { 18 19 bw.write(line); 20 bw.newLine(); 21 bw.flush(); 22 } 23 24 //给服务器一个信号,上面的文本中的数据已经传递完毕 25 s.shutdownOutput(); 26 27 // 接收反馈 28 BufferedReader brr = new BufferedReader(new InputStreamReader( 29 s.getInputStream())); 30 31 // 获取反馈,并输出到控制台 32 String line1 = null; 33 while ((line1 = brr.readLine()) != null) { 34 System.out.println(line1); 35 } 36 37 brr.close(); 38 s.close(); 39 br.close(); 40 41 } 42 }