栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java实现简单的P2P聊天软件

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java实现简单的P2P聊天软件

实习第一周,由于后续的项目需要大量用到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);
        }
    }


    
    @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
            
            // 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);
        }

    }

    
    @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);
        }
    }

    
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035931.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号