实现步骤
-
-
创建多线程类,在run()方法中读取客户端发送的数据,为了防止文件重名,使用计数器给文件名编号,接受结束后使用输出流给客户端发送反馈信息。
-
创建服务端对象,每监听到一个客户端则开启一个新的线程接受数据。
-
客户端
package TCPDemo; import java.io.*; import java.net.Socket; public class ClientDemo { public static void main(String[] args) throws IOException { //创建客端Socket对象 Socket sc =new Socket("192.168.1.210",10086); //封装数据包,创建缓冲字符输入流对象,用来封装文本文件 BufferedReader bufferedReader = new BufferedReader(new FileReader("UDPandTCPdemo\\ReceiveDemo.java")); //创建字符缓冲输出流,将数据封装到流中并写入数据 BufferedWriter bf =new BufferedWriter(new OutputStreamWriter(sc.getOutputStream())); //创建字符串对象,写入数据 String line; //while循环,读取字符缓冲输入流对象 while ((line = bufferedReader.readLine())!=null){ //写入到字符缓冲输出流对象中 bf.write(line); bf.newLine(); bf.flush(); } //禁用此套接字的输出流 sc.shutdownOutput(); //接受反馈 BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(sc.getInputStream())); //等待读取数据 String data = bufferedReader1.readLine(); //返回结果 System.out.println("服务器反馈 "+data); //释放资源 bufferedReader1.close(); sc.close(); } }
服务端
package TCPDemo; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; public class ServerDemo01 { public static void main(String[] args) throws IOException { //创建服务段对象 ServerSocket serverSocket = new ServerSocket(10086); //死循环保持服务端一直开启 while (true) { //监听客户端连接,返回一个对应Socket对象 Socket socket = serverSocket.accept(); //为每一个客户端开启一个线程 new Thread(new ServerThread(socket)).start(); } } }
线程类
package TCPDemo; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class ServerThread implements Runnable { private Socket s; public ServerThread(Socket s) { this.s = s; } @Override public void run() { //抛出异常 try { //接收数据写入到文本文档 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(s.getInputStream())); //解决重名问题,定义一个变量 int count = 0; //创建新文档 File file = new File("UDPandTCPdemo\\ccc(" + count + ").java"); //循环判断 while (file.exists()) { //如果重名,变量加加 count++; //写入新的文档中 file = new File("UDPandTCPdemo\\ccc(" + count + ").java"); } //服务器反馈 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); bwServer.write("文件上传成功"); bwServer.newLine(); bwServer.flush(); //释放资源 s.close(); } catch (IOException e) { e.printStackTrace(); } } }