利用socket和TCP编写,允许客户端指定一个文件名,并让服务器发回文件内容,或者指出文件不存在

一、问题描述

利用socket和TCP编写,允许客户端指定一个文件名,并让服务器发回文件内容,或者指出文件不存在


二、实现代码

一、服务端

package tcp;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

    /**服务器套接字 */
    private ServerSocket serverSocket; 
    /**套接字 */
    private Socket socket;
    /**创建文件 */
    private File file;
    /**输出流 */
    private BufferedWriter writer;
    /**输入流 */
    private BufferedReader reader;

    Server() {
        getServer();
    }

    /**
     * 开启服务
     */
    public void getServer() {
        try {
            // 创建服务器套接字
            serverSocket = new ServerSocket(9999);
            System.out.println("服务器套接字已经创建成功");
            while (true) {
                System.out.println("等待客户机的连接");
                // 等待客户机连接
                socket = serverSocket.accept();
                System.out.println("客户机已连接");
                // 实例化BufferedReader对象
                reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                // 实例化BufferedReader对象
                writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
                System.out.println("等待客户机发送消息");
                do {
                    String message;
                    // 循环接受信息
                    while ((message = reader.readLine()) == null) {}
                    // 收到信息
                    System.out.println("客户机:" + message);
                    // 处理信息
                    handleMessage(message);
                }while (true);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 返回文件内容
     * @param message :收到的文件名
     */
    private void handleMessage(String message) {
        String content;
        try {
            file = new File(message);
            if (!file.exists()) {
                // 文件不存在,返回提示
                writer.write("该文件不存在\n");
                writer.newLine();
                writer.flush();
            }else {
                // 创建文件输入流
                BufferedReader fileReader = new BufferedReader(new FileReader(file));
                // 读取文件内容
                while ((content = fileReader.readLine()) != null) {
                    // 输出内容给客户机
                    writer.write(content);
                    writer.newLine();
                    writer.flush();
                }
                // 关闭文件输入流
                if (fileReader != null) {
                    fileReader.close();
                }
            }
            // 作为结束符
            writer.write("end");
            writer.newLine();
            writer.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new Server();
    }
}


二、客户端

package tcp;

import java.io.*;
import java.net.Socket;

public class Client {
    private Socket socket;
    private BufferedReader reader;
    private BufferedWriter writer;

    public void connect() throws IOException {
        // 连接本地的9999端口
        socket = new Socket("127.0.0.1",9999);
        // 实例化BufferedWriter对象
        writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        // 实例化BufferedReader对象
        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    }

    /**
     * 发送消息
     * @param message : 要发送的内容
     * @throws IOException
     */
    public void sendMessage(String message) throws IOException {
        if (writer != null) {
            writer.write(message);
            // 结束符
            writer.newLine();
            // 刷新流
            writer.flush();
        }
    }

    /**
     * 处理文件内容
     * @return 返回文件内容
     * @throws IOException
     */
    public String getContent() throws IOException {
        String content;
        StringBuilder builder = new StringBuilder();
        if (reader == null) {
            reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        }
        try {
            // 尚未读到结束符,内容添加到StringBuilder中
            while (!("end".equals((content = reader.readLine())))) {
                builder.append(content);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder.toString();
    }
}


三、主界面

package tcp;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

public class MainFrame extends JFrame {
    // 客户端
    private static final Client client = new Client();
    private JTextField input;
    private JLabel label;
    private JTextArea output;
    private JButton button;

    MainFrame() {
        setTitle("TCP测试");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(300,200,400,500);
        setLayout(null);
        // 添加提示标签
        label = new JLabel("请输入文件名称+后缀名:");
        label.setFont(new Font("华文中宋 常规", Font.PLAIN,12));
        label.setBounds(0,430,150,30);
        getContentPane().add(label);
        // 添加输入文本框
        input = new JTextField();
        input.setFont(new Font("华文中宋 常规", Font.PLAIN,14));
        input.setBounds(150,430,150,30);
        getContentPane().add(input);
        //添加输出的文本区域
        output = new JTextArea();
        output.setFont(new Font("华文中宋 常规", Font.PLAIN,13));
        output.setPreferredSize(new Dimension(380,5000));
        // 自动换行
        output.setLineWrap(true);
        final JScrollPane scrollPane = new JScrollPane();
        // 文本域添加滚动面板中
        scrollPane.setViewportView(output);
        scrollPane.setBounds(0,0,380,430);
        getContentPane().add(scrollPane);
        //添加发送按钮
        button = new JButton("发 送");
        button.setFont(new Font("华文中宋 常规", Font.PLAIN,14));
        button.setBounds(310,430,70,30);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                // 子线程进行消息处理
                new Thread(() -> {
                    try {
                        // 发送消息
                        client.sendMessage(input.getText());
                        output.setText("");
                        output.append("发送完成\n");
                        // 文本框清空
                        input.setText("");
                        // 显示文件内容
                        output.append(client.getContent() + "\n");
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }).start();
            }
        });
        getContentPane().add(button);
        // 连接服务端
        init();
        setVisible(true);
    }

    /**
     * 尝试连接服务端
     */
    private void init() {
        output.append("正在连接...\n");
        try {
            client.connect();
            output.append("完成连接\n");
        } catch (IOException e) {
            output.append("连接失败\n");
        }
    }


    public static void main(String[] args) {
        new MainFrame();
    }
}

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读