Java实现简单的P2P聊天软件

33 篇文章 1 订阅

实习第一周,由于后续的项目需要大量用到socket方面的知识,导师第一周给的任务是写一个设计一个基于最基本Socket的P2P“聊天软件”(文本互传),要求在同一个网关内可以通过任意常用端口建立会话并进行socket通讯、双向文本收发。于是开始了面向百度编程。
socket这一块搞的晕头转向,最后好歹也是明白了
不知道是什么问题最后运行还是Connection refused: connect
搜了一堆都说断口冲突了,但是改了端口还是连不上 求大神解答
在这里插入图片描述

在这里插入图片描述

//服务端
package com.fang;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Properties;

public class Server extends JFrame implements ActionListener {

    // 属性
    // frame组件
    //private JFrame jFrame;
    // 文本区
    private JTextArea jTextArea;
    // 滚动条
    private JScrollPane jScrollPane;
    //面板 → (文本框 + 发送按钮)
    private JPanel jPanel;
    private JTextField jTextField;
    private JButton jButton;
    private BufferedWriter bufferedWriter;
    private static int serverPort;
    static {
        Properties properties = new Properties();
        try {
            properties.load(new FileReader("chat.properties"));
            serverPort = Integer.parseInt(properties.getProperty("serverPort"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //方法
    //构造方法
    public Server() {
        // 文本区放入滑动组件
        jTextArea = new JTextArea();
        // 自动滚动 + 不可编辑
        jTextArea.setAutoscrolls(true);
        jTextArea.setEditable(false);
        jScrollPane = new JScrollPane(jTextArea);
        // 好像不能这么写
        // jScrollPane.add(jTextArea);

        // 按钮+文本框 放入 panel 组件  分别放在东西两侧
        jButton = new JButton("SEND");
        jTextField = new JTextField(20);
        jPanel = new JPanel();
        jPanel.add(jTextField, BorderLayout.WEST);
        jPanel.add(jButton, BorderLayout.EAST);

        // 滚动组件 + panel 添加到 frame 组件 并滚动组件放到中间,panel放到南部
        this.add(jPanel, BorderLayout.SOUTH);
        this.add(jScrollPane, BorderLayout.CENTER);

        // 标题 尺寸
        this.setTitle("对话-服务端");
        this.setSize(500, 400);
        this.setLocation(600, 300);

        // 设置事件 静态方法 当jframe关闭时触发对象结束
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        //TCP协议
        // 给按钮绑定监听事件
        jButton.addActionListener(this);
        try {
            // 1. 创建套接字 选择一个端口-6666
            ServerSocket serverSocket = new ServerSocket(serverPort);
            // 2. 等待客户端连接 返回socket对象
            Socket socket = serverSocket.accept();
            // System.out.println("连接完成");
            // 3. 获取socket 先获取输入流 然后获取输入流读取对象 最后使用BufferedReader 对象逐行获取输入
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line = bufferedReader.readLine();
            while (line != null) {
                jTextArea.append(line + System.lineSeparator());
            }
            // 4. 输出流
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            bufferedWriter = new BufferedWriter(outputStreamWriter);
            // 4. 关掉套接字
            serverSocket.close();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    /**
     * Invoked when an action occurs.
     *
     * @param e the event to be processed
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //System.out.println("我被点击");
        //获取文本框输入的内容
        String text = jTextField.getText();
        text = "SERVER: " + text;
        //在自己的文本区显示
        jTextArea.append(text);
        //实现发送
        // Connection refused: connect 无法实现 bufferedWriter 对象的使用
        try {
            bufferedWriter.write(text);
            bufferedWriter.newLine(); //换行
            bufferedWriter.flush(); //刷新
            jTextField.setText("");
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }
}

//客户端
package com.fang;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.util.Properties;

public class Client extends JFrame implements ActionListener {
    // 属性
    // frame组件
    //private JFrame jFrame;
    // 文本区
    private JTextArea jTextArea;
    // 滚动条
    private JScrollPane jScrollPane;
    //面板 → (文本框 + 发送按钮)
    private JPanel jPanel;
    private JTextField jTextField;
    private JButton jButton;
    private BufferedWriter bufferedWriter;
    private static int clientPort;
    static {
        try {
            Properties properties = new Properties();
            FileReader fileReader = new FileReader("chat.properties");
            properties.load(fileReader);
            clientPort = Integer.parseInt(properties.getProperty("clientPort"));
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    //方法
    //构造方法
    public Client() {
        // 文本区放入滑动组件
        jTextArea = new JTextArea();
        // 自动滚动 + 不可编辑
        jTextArea.setAutoscrolls(true);
        jTextArea.setEditable(false);
        jScrollPane = new JScrollPane(jTextArea);
        // 好像不能这么写
        // jScrollPane.add(jTextArea);

        // 按钮+文本框 放入 panel 组件  分别放在东西两侧
        jButton = new JButton("SEND");
        jTextField = new JTextField(20);
        jPanel = new JPanel();
        jPanel.add(jTextField, BorderLayout.WEST);
        jPanel.add(jButton, BorderLayout.EAST);

        // 滚动组件 + panel 添加到 frame 组件 并滚动组件放到中间,panel放到南部
        this.add(jPanel, BorderLayout.SOUTH);
        this.add(jScrollPane, BorderLayout.CENTER);

        // 标题 尺寸
        this.setTitle("对话-客户端");
        this.setSize(500, 400);
        this.setLocation(600, 300);

        // 设置事件 静态方法 当jframe关闭时触发对象结束
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //TCP协议
        // 给SEND按钮绑定监听点击事件
        jButton.addActionListener(this);
        try {
            // 1. 创建套接字 选择一个端口-6666
            /*Socket socket = new Socket();*/
            // 2. 创建socket对象 实现与服务端连接
            Socket socket = new Socket("127.0.0.1", clientPort);
            // 3. 获取socket 先获取输入流 然后获取输入流读取对象 最后使用BufferedReader 对象逐行获取输入
            InputStream inputStream = socket.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String line = bufferedReader.readLine();
            while (line != null) {
                jTextArea.append(line + System.lineSeparator());
            }
            // 4. 输出流
            OutputStream outputStream = socket.getOutputStream();
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
            bufferedWriter = new BufferedWriter(outputStreamWriter);
            // 4. 关掉套接字
            socket.close();

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    /**
     * Invoked when an action occurs.
     *
     * @param e the event to be processed
     */
    @Override
    public void actionPerformed(ActionEvent e) {
        //System.out.println("我被点击");
        //获取文本框输入的内容
        String text = jTextField.getText();
        text = "CLIENT: " + text;
        //在自己的文本区显示
        jTextArea.append(text);
        //实现发送
        // Connection refused: connect 无法实现 bufferedWriter 对象的使用
        try {
            bufferedWriter.write(text);
            bufferedWriter.newLine(); //换行
            bufferedWriter.flush(); //刷新
            jTextField.setText("");
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
    }

    /*public Client(JTextArea jTextArea, JScrollPane jScrollPane01, JPanel jPanel, JTextField jTextField, JButton jButton) {
        this.jTextArea = jTextArea;
        this.jScrollPane = jScrollPane01;
        this.jPanel = jPanel;
        this.jTextField = jTextField;
        this.jButton = jButton;
    }*/
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EricFang0001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值