网络编程实践——套接字程序实现

这两关都是把代码复制粘贴一下即可。

第1关 模拟客户端向服务端发送消息

编程要求

仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,编写一个客户端,向指定服务端发送消息并接收服务端返回的消息,具体如下:

  • 接收给定的一行字符串(如:我是客户端1号,该字符串用于客户端发送给服务端);
  • 编写一个客户端,向服务端发送给定消息并接收服务端返回的消息。

注意:服务端 IP 为 127.0.0.1,端口号为 9999,并且后台已经启动服务端。

测试说明

平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。

例: 测试输入:

  1. 我是客户端1号

预期输出:

  1. 你好客户端1号
  2.  

注意:末尾有一个空行。

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() 关闭客户端的输出流。

测试说明

平台将使用运行你编写的程序代码,若运行结果与预期输出一致,则通关。

复制时请注意复制到正确的文件中,图示区域可选择切换文件:

81b984b47664423c806a7564acbf4d56.png

首先是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 **********/


    }
}

 

 

 

 

 

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HTTP协议是应用层协议,常用于Web应用程序之间的通信。在Python中,可以使用套接字编程实现HTTP协议。以下是一些示例代码,展示如何使用Python套接字编程实现HTTP协议。 1. 发起HTTP请求 ```python import socket HOST = 'www.example.com' PORT = 80 BUFFER_SIZE = 1024 # 创建套接字 client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 client_socket.connect((HOST, PORT)) # 发送HTTP请求 request = "GET / HTTP/1.1\r\nHost: {}\r\n\r\n".format(HOST) client_socket.send(request.encode()) # 接收响应 response = client_socket.recv(BUFFER_SIZE) # 打印响应 print(response.decode()) # 套接字 client_socket.close() ``` 2. 构建HTTP响应 ```python import socket HOST = '' PORT = 8080 BUFFER_SIZE = 1024 # 创建套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口号 server_socket.bind((HOST, PORT)) # 监听连接请求 server_socket.listen(1) # 处理连接 while True: # 接受连接请求 client_socket, client_address = server_socket.accept() # 接收HTTP请求 request = client_socket.recv(BUFFER_SIZE) # 构建HTTP响应 response = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<html><body><h1>Hello World!</h1></body></html>" # 发送HTTP响应 client_socket.send(response.encode()) # 套接字 client_socket.close() ``` 以上代码只是简单地演示了如何使用Python套接字编程实现HTTP协议。实际上,HTTP协议有许多复杂的细节和规则,需要更加详细的学习和理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值