这两关都是把代码复制粘贴一下即可。
第1关 模拟客户端向服务端发送消息
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,编写一个客户端,向指定服务端发送消息并接收服务端返回的消息,具体如下:
- 接收给定的一行字符串(如:我是客户端1号,该字符串用于客户端发送给服务端);
- 编写一个客户端,向服务端发送给定消息并接收服务端返回的消息。
注意:服务端 IP 为 127.0.0.1,端口号为 9999,并且后台已经启动服务端。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
例: 测试输入:
我是客户端1号
预期输出:
你好客户端1号
注意:末尾有一个空行。
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Arrays;
import java.util.Scanner;
public class SocketTest {
public static void main(String[] args) throws IOException {
// 请在Begin-End间编写代码
/********** Begin **********/
// 获取给定的字符串
Scanner scanner = new Scanner(System.in);
String message = scanner.nextLine();
// 创建与服务端的连接
Socket clientSocket = new Socket("127.0.0.1", 9999);
// 发送消息给服务端
OutputStream outputStream = clientSocket.getOutputStream();
outputStream.write(message.getBytes());
outputStream.flush();
// 接收服务端返回的消息
InputStream inputStream = clientSocket.getInputStream();
byte[] buffer = new byte[1024];
int len = inputStream.read(buffer);
String receivedMessage = new String(buffer, 0, len);
System.out.println(receivedMessage);
// 关闭连接
inputStream.close();
outputStream.close();
clientSocket.close();
/********** End **********/
}
}
第2关:文件上传
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 编写代码,实现文件上传功能,具体要求如下:
- 接收给定的字符串(如:/test/a.txt,客户端本地文件路径);
- 在 SocketTest.java 文件中编写客户端代码,服务器的 IP 为 127.0.0.1,端口为 8127;
- 在 FileTest.java 文件中编写服务器端代码,将客户端的文件保存到其本地 /file/aa.txt 文件(该文件需要自己创建)中,如果保存成功,向客户端返回“上传成功”四个字。
友情提示:当你运行你编写代码后,客户端和服务器端都处于僵持等待状态,可以尝试在客户端上传文件给服务端之后,使用 Socket 对象调用 shutdownOutput() 关闭客户端的输出流。
测试说明
平台将使用运行你编写的程序代码,若运行结果与预期输出一致,则通关。
复制时请注意复制到正确的文件中,图示区域可选择切换文件:
首先是SocketTest.java文件:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class SocketTest {
public static void main(String[] args) throws IOException {
// 请在Begin-End间编写客户端代码
/********** Begin **********/
// 获取给定的文件路径
Scanner scanner = new Scanner(System.in);
String filePath = scanner.nextLine();
// 创建本地字节输入流对象
FileInputStream fis = new FileInputStream(filePath);
// 创建客户端Socket对象
Socket socket = new Socket("127.0.0.1", 8127);
// 创建网络字节流输出流对象
OutputStream os = socket.getOutputStream();
// 读取本地文件
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
// 使用网络字节输出流把文件上传到服务器
os.write(buffer, 0, len);
}
// 关闭网络输出流
socket.shutdownOutput();
// 获取服务器返回的数据
InputStream is = socket.getInputStream();
byte[] responseBuffer = new byte[1024];
int responseLen = is.read(responseBuffer);
String response = new String(responseBuffer, 0, responseLen);
System.out.println(response);
// 释放资源
is.close();
fis.close();
socket.close();
/********** End **********/
}
}
然后是FileTest.java文件:
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class FileTest {
public static void main(String[] args) throws IOException, ClassNotFoundException {
// 请在Begin-End间编写服务器端代码
/********** Begin **********/
// 创建 ServerSocket 服务端对象
ServerSocket serverSocket = new ServerSocket(8127);
// 获取客户端对象 Socket
Socket socket = serverSocket.accept();
// 获取网络字节流输入流 InputStream 对象
InputStream is = socket.getInputStream();
// 判断 /file 文件夹是否存在,不存在则创建
File fileDir = new File("/file");
if (!fileDir.exists()) {
fileDir.mkdirs();
}
// 创建本地输出流对象
FileOutputStream fos = new FileOutputStream("/file/aa.txt");
// 读取客户端发送的数据
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
// 给客户端返回提示语:“上传成功”
OutputStream os = socket.getOutputStream();
os.write("上传成功".getBytes());
// 释放资源
fos.close();
is.close();
socket.close();
serverSocket.close();
/********** End **********/
}
}