花几千上万学习Java,真没必要!(四十五)

1、客户端从键盘输入数据:

测试代码:

package test.client;
import java.io.*;  
import java.net.*;  
import java.util.Scanner;  
  
public class ClientScanner {  
    public static void main(String[] args) throws IOException {  
        String hostname = "localhost"; // 服务器地址  
        int port = 8000; // 服务器端口  
  
        try (Socket socket = new Socket(hostname, port)) {  
            Scanner scanner = new Scanner(System.in);  
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);  
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  
            System.out.println("Enter messages (type 'exit' to quit):");  
            String line;  
            while (!(line = scanner.nextLine()).equals("exit")) {  
                output.println(line); // 发送消息到服务器  
                System.out.println("Server: " + input.readLine()); // 读取服务器的反馈  
            }  
  
            output.close();  
            input.close();  
            scanner.close(); 
        }  
    }  
}

服务器端接收数据并将其保存在txt文件中:

测试代码:

package test.server;
import java.io.*;  
import java.net.*;  
  
public class ServerInPutTxt {  
    public static void main(String[] args) throws IOException {  
        int port = 8000; // 设定端口号  
        ServerSocket serverSocket = new ServerSocket(port);  
        System.out.println("Server is running on port " + port);  
  
        try (Socket socket = serverSocket.accept()) { // 等待客户端连接  
            System.out.println("Client connected!");  
  
            BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
            PrintWriter output = new PrintWriter(socket.getOutputStream(), true);  
  
            try (BufferedWriter writer = new BufferedWriter(new FileWriter("received_data.txt", true))) { // 追加模式  
                String inputLine;  
                while ((inputLine = input.readLine()) != null) {  
                    System.out.println("Received: " + inputLine);  
                    writer.write(inputLine + "\n"); // 写入文件  
                    writer.flush(); // 刷新输出流  
                    output.println("Data received and saved."); // 发送反馈  
                }  
            }  
  
            output.close();  
            input.close();  
        }  
  
        serverSocket.close();  
    }  
}

运行结果如下:

 

....................................................................................................................................................... 

2、 客户端数据来自txt文件:

测试代码:

package test.client;
import java.io.*;  
import java.net.*;  
  
public class ClientFromTxt {  
    public static void main(String[] args) throws IOException {  
        String hostname = "localhost";  
        int port = 8000;  
        String filePath = "E:\\data.txt";  
  
        try (Socket socket = new Socket(hostname, port);  
             PrintWriter output = new PrintWriter(socket.getOutputStream(), true);  
             BufferedReader fileReader = new BufferedReader(new FileReader(filePath));  
             BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {  
  
            String line;  
            while ((line = fileReader.readLine()) != null) {  
                output.println(line);  
            }  
  
            // 发送完所有数据后,关闭输出流  
            output.flush(); // 确保所有数据都被发送  
            socket.shutdownOutput(); // 显式告知服务器已经完成发送  
  
            // 读取服务器的反馈  
            String serverResponse;  
            while ((serverResponse = input.readLine()) != null) {  
                System.out.println("Server: " + serverResponse);  
            }  
  
            // 假设服务器在发送完所有反馈后会关闭它的输出流。  
            // 如果不是这样,客户端会在这个循环中永远等待下去。  
            // 在实际应用中,需要设置一个超时机制避免这种情况。  
  
        } // try-with-resources语句会自动关闭所有已声明的资源  
    }  
}

服务器端代码同上。

............................................................................................................................................

3、客户端向服务器端上传文件。

客户端代码:

package test.client;
import java.io.*;  
import java.net.Socket;
import java.net.SocketTimeoutException;  
  
public class FileClient {  
    public static void main(String[] args) throws IOException, InterruptedException {  
        String host = "localhost";  
        int port = 8000;  
        File file = new File("E://MT29F_509929.pdf");  
  
        try (Socket socket = new Socket(host, port);  
             FileInputStream fileInputStream = new FileInputStream(file);  
             OutputStream outputStream = socket.getOutputStream()) {  
  
            byte[] buffer = new byte[1024]; // 使用更大的缓冲区以提高效率  
            int bytesRead;  
  
            while ((bytesRead = fileInputStream.read(buffer)) != -1) {  
                outputStream.write(buffer, 0, bytesRead);  
            }  
  
            // 告知服务器数据已经发送完毕  
            socket.shutdownOutput();  
  
            // 读取服务器响应  
            InputStream inputStream = socket.getInputStream();  
            int timeout = 5000; // 设置超时时间为5秒  
            socket.setSoTimeout(timeout);  
  
            try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) {  
                String response = reader.readLine();  
                System.out.println("Server response: " + response);  
            } catch (SocketTimeoutException e) {  
                System.out.println("No response from server within " + timeout + " ms.");  
            }  
        }  
    }  
}

服务器端代码:

package test.server;
//服务器端代码
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class FileServer {
 public static void main(String[] args) {
     try (ServerSocket serverSocket = new ServerSocket(9999)) {
         while (true) {
             System.out.println("Waiting for client...");
             Socket clientSocket = serverSocket.accept();
             System.out.println("Client connected");

             // 接收文件
             InputStream inputStream = clientSocket.getInputStream();
             FileOutputStream fileOutputStream = new FileOutputStream("server_upload.pdf");

             int data;
             while ((data = inputStream.read()) != -1) {
                 fileOutputStream.write(data);
             }

             System.out.println("File received");

             // 关闭输出流,向客户端发送结束标志
             clientSocket.shutdownOutput();

             // 给出反馈
             OutputStream outputStream = clientSocket.getOutputStream();
             outputStream.write("File received successfully.".getBytes());

             // 关闭连接
             inputStream.close();
             fileOutputStream.close();
             outputStream.close();
             clientSocket.close();
         }
     } catch (IOException e) {
         e.printStackTrace();
     }
 }
}

........................................................................................................................................................ 

 4、服务器端使用子线程响应客户端的请求。

客户端代码:

package test.client;
//客户端代码
import java.io.*;
import java.net.Socket;

public class ClientSendFile {
 public static void main(String[] args) {
     try {
         Socket socket = new Socket("localhost", 9999);

         OutputStream outputStream = socket.getOutputStream();
         FileInputStream fileInputStream = new FileInputStream("E://MT29F_509929.pdf");

         int data;
         while ((data = fileInputStream.read()) != -1) {
             outputStream.write(data);
         }

         System.out.println("File sent");

         socket.shutdownOutput();

         // 接收反馈
         InputStream inputStream = socket.getInputStream();
         byte[] feedback = new byte[1024];
         int bytesRead;
         long startTime = System.currentTimeMillis();
         while ((bytesRead = inputStream.read(feedback)) == -1) {
             long currentTime = System.currentTimeMillis();
             if (currentTime - startTime > 5000) {
            	 System.out.println("Server response not received");
                 break;
             }
         }
         if (bytesRead != -1) {
             System.out.println("Server response: " + new String(feedback, 0, bytesRead));
         }

         // 关闭连接
         outputStream.close();
         fileInputStream.close();
         inputStream.close();
         socket.close();

     } catch (IOException e) {
         e.printStackTrace();
     }
 }
}

服务器端代码:

package test.server;
//服务器端代码
import java.io.*;  
import java.net.ServerSocket;  
import java.net.Socket;  
  
public class FileServerThread {  
    public static void main(String[] args) {  
        try (ServerSocket serverSocket = new ServerSocket(9999)) {  
            System.out.println("Server is listening on port 9999...");  
  
            while (true) { // 使用无限循环来不断接受新的客户端连接  
                Socket clientSocket = serverSocket.accept();  
                System.out.println("Client connected");  
  
                // 将客户端连接交给新的线程处理  
                Thread thread = new Thread(new ClientHandler(clientSocket));  
                thread.start();  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
  
    // 处理客户端请求的线程类  
    public static class ClientHandler implements Runnable {  
        private Socket clientSocket;  
  
        public ClientHandler(Socket clientSocket) {  
            this.clientSocket = clientSocket;  
        }  
  
        @Override  
        public void run() {  
            try (InputStream inputStream = clientSocket.getInputStream();  
                 FileOutputStream fileOutputStream = new FileOutputStream("server_upload.pdf");  
                 OutputStream outputStream = clientSocket.getOutputStream()) {  
  
                int data;  
                while ((data = inputStream.read()) != -1) {  
                    fileOutputStream.write(data);  
                }  
  
                System.out.println("File received");  
  
                // 给出反馈  
                outputStream.write("File received successfully.".getBytes());  
  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
}

运行结果如下:

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值