计算机网络——Socket实验3

简介: 计算机网络——Socket实验3

实验过程

关于TCP协议的Socket和ServerSocket类的相关内容已经在前面实验5-1和实验5-2介绍完毕,此处不作赘述。


1 代码描述


首先,对于服务器端可编写代码如下,如代码 1先引入必要的包:


de3356e853294d74b3ae1ac8af682fe7.png


代码 1 服务端引入必要的包


然后定义如代码 2的文件服务类,包含连接客户端的socket,服务端的server_socket,端口port,文件路径file_path,以及字节流大小buffersize五个成员变量以及用于获取文件列表的getFileList方法,创建连接的getConnect方法和用于执行的run方法。


ab038223c8e445dead75aafcafb313f3.png


代码 2 服务端定义文件服务类


对于代码 3中的getFileList方法,先输出提示语,并利用工作目录创建文件获取文件列表,遍历文件列表进行判断,仅输出是文件的目录,如果是路径则不进行输出。并用Scanner获取输入以获得要进行传输的文件的名字。


e804820be9dc4480bf25d11e5c495a63.png


代码 3 服务端getFileList方法


对于代码 4中的getConnect方法,利用代码 3中的getFileList方法获取的文件名读对应的文件。在接受客户端的Socket后,使用重定向的字符流将文件的名字和文件内容通过socket传给客户端。完成传输后清空缓冲区并关闭socket。


d45da304869a40f990167cdd144e6a83.png


代码 4 服务端getConnect方法


对于代码 5中的run方法,依次执行代码 3中的getFileList方法和代码 4中的getConnect方法即可。


183a3a5611db4f15b0f24648a7297ced.png


代码 5 服务端的run方法


对于客户端,也要引入如代码 6的库:


9f14fae9288a43c1b59c8844dd25e39f.png


代码 6 客户端的库


      定义如代码 7的客户端文件类,包含连接客户端的client_socket,IP,端口port,文件保存路径save_path,以及字节流大小buffersize五个成员变量以及用于创建连接的getConnect方法。


6f8da5c74eff4cd088fe999a5fa9050a.png


代码 7 客户端定义文件类


对于如的getConnect方法,通过ip和port创建socket后借助buffer流,获取服务端的文件流,并借助重定向将文件保存下来。


4dd5da162fd241cdb6fb925d5e4a8e17.png


代码 8 客户端getConnect方法


2 测试运行


首先,运行服务端。将显示如图 1的文件列表。


b23415e280474b21a7ebdf991cf9b19e.png


图 1 文件列表


在此以传输test.txt为例,输入test.txt。结果如图 2


a2a5d2f403164492b0bc87c75b3b5b27.png


图 2 选择test.txt进行测试


紧接着,客户端开始建立连接,获取文件并自动重命名如图 3


45ed79ea5a7a497b89e5bddd633ae6a7.png


图 3 客户端建立连接并获取文件


完成传输后,服务端也给出如图 4的提示。


b9501bc2be36417381d30668e4a1bb5d.png


图 4 服务端完成传输


最后检验一下传输的结果,如图 5,可以看到传输成功。


39337d6b6cc6422782e6ba550987234f.png


图 5 传输结果


【附件】


Client.java


import java.io.*;
import java.net.*;
public class File_client {
    private Socket Client_Socket;                           //Create the client socket
    private String ip = "localhost";                        //Create the string of IP which has the default value set to "localhost"
    private int buffersize = 1024;
    private int port = 6574;
    private String save_path;             //Create the string of save path
    private void getConnect() {
        try {
            Client_Socket = new Socket(ip, port);            //Try to connect to the server socket
            System.out.println("Connection is built.");
            DataInputStream in = new DataInputStream(Client_Socket.getInputStream());
            String get_path = in.readUTF();
            save_path = "./received_" + get_path;
            DataOutputStream out = new DataOutputStream(Client_Socket.getOutputStream());
            DataOutputStream file_out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(save_path)));
            //Try to read the content from the server
            System.out.println("Receiving " + get_path);
            System.out.println("Saving in " + save_path);
            byte[] buffer = new byte[buffersize];           //Use buffer to store the data
            int length = 0;
            while ((length = in.read(buffer, 0, buffer.length)) > 0) {
                file_out.write(buffer, 0, length);          //Write out the data
                file_out.flush();
            }
            System.out.println("Finished " + save_path);
            file_out.close();
        } catch (Exception e) {
            System.out.println("Error:" + e);
        }
    }
    public static void main(String[] args) {
        new File_client().getConnect();
    }
}

Server.java

import java.io.*;
import java.net.*;
import java.util.Scanner;
public class File_server {
    private Socket socket;                               //Create the socket to connect to the client
    private ServerSocket server_socket;                  //Create the server socket
    private int port = 6574;
    private String file_path;                            //the path of the file
    private int buffersize = 1024;
    void getFileList() throws IOException {
        System.out.println("Choose your file to transfer!");
        System.out.println("====================================");
        File file = new File(new File("").getCanonicalPath());
        File[] files = file.listFiles();
        for (File f : files) {
            if (f.isFile()) {
                System.out.println(f.getName());
            }
        }
        Scanner scanner = new Scanner(System.in);
        file_path = scanner.next();
    }
    void getConnect() {
        try {
            server_socket = new ServerSocket(port);         //Set server socket using the same port
            File file = new File(file_path);
            System.out.println("============Server is on============");
            socket = server_socket.accept();             //Try to connect to the client
            System.out.println("============Connection is built============");
            DataInputStream in = new DataInputStream(socket.getInputStream());
            DataInputStream file_in = new DataInputStream(new BufferedInputStream(new FileInputStream(file_path)));
            DataOutputStream out = new DataOutputStream(socket.getOutputStream());
            System.out.println("Sending file: " + file_path);
            out.writeUTF(file.getPath());                //Write in the file path to the client
            out.flush();
            byte[] buffer = new byte[buffersize];
            int length = 0;
            while ((length = file_in.read(buffer, 0, buffer.length)) > 0) {
                out.write(buffer, 0, length);            //Write in the file content to the client
                out.flush();
            }
            System.out.println("Finished.");
            out.flush();
            file_in.close();
            socket.close();
            server_socket.close();
        } catch (IOException e) {
            System.out.println("Error!");
            System.out.println(e);
        }
    }
    void run() throws IOException {
        getFileList();
        getConnect();
    }
    public static void main(String[] args) throws IOException {
        new File_server().run();
    }
}
相关文章
|
8天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
8天前
|
程序员 开发者 Python
Python网络编程基础(Socket编程) 错误处理和异常处理的最佳实践
【4月更文挑战第11天】在网络编程中,错误处理和异常管理不仅是为了程序的健壮性,也是为了提供清晰的用户反馈以及优雅的故障恢复。在前面的章节中,我们讨论了如何使用`try-except`语句来处理网络错误。现在,我们将深入探讨错误处理和异常处理的最佳实践。
|
1月前
|
网络协议 Linux C语言
Linux实现socket网络通信
Linux实现socket网络通信
|
1月前
|
网络协议 安全 API
计算机网络之Socket编程
计算机网络之Socket编程
|
8天前
|
存储 算法 Linux
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
【实战项目】网络编程:在Linux环境下基于opencv和socket的人脸识别系统--C++实现
24 6
|
29天前
|
弹性计算 网络协议 关系型数据库
网络技术基础阿里云实验——企业级云上网络构建实践
实验地址:<https://developer.aliyun.com/adc/scenario/65e54c7876324bbe9e1fb18665719179> 本文档指导在阿里云上构建跨地域的网络环境,涉及杭州和北京两个地域。任务包括创建VPC、交换机、ECS实例,配置VPC对等连接,以及设置安全组和网络ACL规则以实现特定服务间的互访。例如,允许北京的研发服务器ECS-DEV访问杭州的文件服务器ECS-FS的SSH服务,ECS-FS访问ECS-WEB01的SSH服务,ECS-WEB01访问ECS-DB01的MySQL服务,并确保ECS-WEB03对外提供HTTP服务。
网络技术基础(19)——PPPoE实验
【3月更文挑战第5天】该文介绍了PPPoE拨号上网的模拟实验。通过运营商提供的PPPoverEthernet服务,设备可以动态获取内网地址并连接到Internet。实验包括服务器和客户端的配置:服务器设置地址池、认证账号和虚拟模板,并绑定到物理接口;客户端配置拨号规则、虚拟拨号口及内网网关,以实现永久在线连接。实验结果显示,客户端成功通过Dialer接口连接到服务器,实现了上网功能。
|
1月前
|
网络协议 Java
【计算机网络】TCP socket编程
【计算机网络】TCP socket编程
|
1月前
|
网络虚拟化
计算机网络VLAN实验
计算机网络VLAN实验