计算机网络——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();
    }
}
相关文章
|
2月前
|
开发者 Python
Python Socket编程:不只是基础,更有进阶秘籍,让你的网络应用飞起来!
在数字时代,网络应用成为连接世界的桥梁。Python凭借简洁的语法和丰富的库支持,成为开发高效网络应用的首选。本文通过实时聊天室案例,介绍Python Socket编程的基础与进阶技巧。基础篇涵盖服务器和客户端的建立与数据交换;进阶篇则探讨多线程与异步IO优化方案,助力提升应用性能。通过本案例,你将掌握Socket编程的核心技能,推动网络应用飞得更高、更远。
55 1
|
22天前
|
Kubernetes 网络协议 Python
Python网络编程:从Socket到Web应用
在信息时代,网络编程是软件开发的重要组成部分。Python作为多用途编程语言,提供了从Socket编程到Web应用开发的强大支持。本文将从基础的Socket编程入手,逐步深入到复杂的Web应用开发,涵盖Flask、Django等框架的应用,以及异步Web编程和微服务架构。通过本文,读者将全面了解Python在网络编程领域的应用。
20 1
|
25天前
|
Java
[Java]Socket套接字(网络编程入门)
本文介绍了基于Java Socket实现的一对一和多对多聊天模式。一对一模式通过Server和Client类实现简单的消息收发;多对多模式则通过Server类维护客户端集合,并使用多线程实现实时消息广播。文章旨在帮助读者理解Socket的基本原理和应用。
20 1
|
30天前
|
消息中间件 监控 网络协议
Python中的Socket魔法:如何利用socket模块构建强大的网络通信
本文介绍了Python的`socket`模块,讲解了其基本概念、语法和使用方法。通过简单的TCP服务器和客户端示例,展示了如何创建、绑定、监听、接受连接及发送/接收数据。进一步探讨了多用户聊天室的实现,并介绍了非阻塞IO和多路复用技术以提高并发处理能力。最后,讨论了`socket`模块在现代网络编程中的应用及其与其他通信方式的关系。
|
1月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
1月前
|
网络协议 网络虚拟化 网络架构
【网络实验】/主机/路由器/交换机/网关/路由协议/RIP+OSPF/DHCP(上)
【网络实验】/主机/路由器/交换机/网关/路由协议/RIP+OSPF/DHCP(上)
63 1
|
2月前
|
网络架构
静态路由 网络实验
本文介绍了如何通过配置静态路由实现不同网络设备间的通信,包括网络拓扑图、设备IP配置、查看路由表信息、配置静态路由和测试步骤。通过在路由器上设置静态路由,使得不同子网内的设备能够互相通信。
静态路由 网络实验
|
2月前
|
网络虚拟化
网络实验 VlAN 中 Trunk Access端口的说明及实验
本文介绍了VLAN技术及其在网络实验中的应用,包括Access端口和Trunk端口的工作原理,以及如何通过实验划分不同VLAN实现内部通信和跨交换机实现VLAN间通信的详细步骤和配置。
网络实验 VlAN 中 Trunk Access端口的说明及实验
|
2月前
|
网络协议 Python
网络世界的建筑师:Python Socket编程基础与进阶,构建你的网络帝国!
在数字宇宙中,网络如同复杂脉络连接每个角落,Python Socket编程则是开启这一世界的钥匙。本文将引导你从基础概念入手,逐步掌握Socket编程,并通过实战示例构建TCP/UDP服务器与客户端。你将学会使用Python的socket模块进行网络通信,了解TCP与UDP的区别,并运用多线程与异步IO提升服务器性能。跟随本文指引,成为网络世界的建筑师,构建自己的网络帝国。
36 2
|
2月前
|
网络协议 Python
告别网络编程迷雾!Python Socket编程基础与实战,让你秒变网络达人!
在网络编程的世界里,Socket编程是连接数据与服务的关键桥梁。对于初学者,这往往是最棘手的部分。本文将用Python带你轻松入门Socket编程,从创建TCP服务器与客户端的基础搭建,到处理并发连接的实战技巧,逐步揭开网络编程的神秘面纱。通过具体的代码示例,我们将掌握Socket的基本概念与操作,让你成为网络编程的高手。无论是简单的数据传输还是复杂的并发处理,Python都能助你一臂之力。希望这篇文章成为你网络编程旅程的良好开端。
57 3