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();
}
}
}
}
运行结果如下: