前言

这里我粘贴一下,物联网大作业的简易聊天工具的相关代码


一、运行起来怎么样?

每一次设置昵称后需要手动建立连接一次
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

分享代码,希望大家指出我代码的不规范之处

好,那么直接上代码

二、具体代码

1.整体结构

如图:项目结构

2.Main代码

package MainMethed;

public class Main{
    public static void main(String[] args) {
        Thread thread1 = new Thread(new Chater());
        thread1.start();
    }
}

3.Chater代码

package MainMethed;

import MainFrame.MyFrame;


public class Chater implements Runnable{

    public Chater() {
    }

    @Override
    public void run() {
        MyFrame myFrame = new MyFrame();
    }

}


4.MassageRecieve代码

package MainMethed;

import MainFrame.MyFrame;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class MessageReceive extends Thread{
    int get_port;
    MyFrame myframe;

    public MessageReceive(int get_port,MyFrame myframe) {
        this.get_port = get_port;
        this.myframe=myframe;
    }

    @Override
    public void run() {
        try {
            DatagramSocket socket=new DatagramSocket(get_port);
            while (true){
                byte[] buffer = new byte[1024];
                DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
                socket.receive(packet);
                if (new String(packet.getData(), 0, packet.getLength()).equals("bye")) {
                    break;
                }
                String msg=new String(packet.getData(), 0, packet.getLength());
                myframe.text.setText(myframe.text.getText()+msg+"\n");
                System.out.println(msg);

            }
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.MassageSend代码

package MainMethed;

import MainFrame.MyFrame;

import java.awt.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class MessageSend extends Thread{
    InetAddress To_ip;
    int To_port;
    int From_port;
    String Sender_name;
    MyFrame myframe;

    public MessageSend(InetAddress to_ip,int to_port,String sender_name,int from_port, MyFrame myframe) {
        To_ip = to_ip;
        To_port = to_port;
        Sender_name=sender_name;
        From_port = from_port;
        this.myframe=myframe;
    }

    @Override
    public void run() {
        try {
            DatagramSocket socket =new DatagramSocket(From_port);
            System.out.println("连接成功");
            while (true){
                while (myframe.in_text==null){
                    Thread.currentThread().sleep(20);
                }
                String msg =Sender_name+":"+myframe.in_text;
                DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, To_ip, To_port);
                socket.send(packet);
                myframe.text.setText(myframe.text.getText()+Sender_name+":"+myframe.in_text+"\n");
                myframe.in_text=null;


                if(new String(packet.getData(),0,packet.getLength()).equals("bye")){
                    break;
                }
            }
            socket.close();
        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

6.MyFrame代码

package MainFrame;


import MainMethed.MessageReceive;
import MainMethed.MessageSend;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;

//1540*870
public class MyFrame extends JFrame {
    public InetAddress to_ip;
    public int to_port;
    public int send_port;
    public int receive_port;
    public String in_text;
    public TextArea text;
    public String sender_name;//昵称

    private JTextField t1;//输入框一,存储目的IP
    private JTextField t2;//输入框二,目的的端口
    private JTextField t3;//输入框三,发送端口
    private JTextField t4;//输入框四,接受端口
    private JTextField intertext;
    private JButton enter;
    private JButton name;
    private JButton set_connection;

    public MyFrame(){
        //这一大块代码是为了创建JUI的整体模块
        Container container = getContentPane();

        setTitle("QQ简易版");
        setVisible(true);
        setBounds(570,135,400,600);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        JPanel panel1=new JPanel(new GridLayout(1,2));
        JPanel panel2=new JPanel();
        JPanel panel3=new JPanel(new GridLayout(2,1));
        JPanel panel4=new JPanel(new FlowLayout());
        panel3.add(panel4);
        panel3.add(new JLabel(" ",SwingConstants.CENTER));
        container.add(panel1,BorderLayout.NORTH);
        container.add(panel2,BorderLayout.CENTER);
        container.add(panel3,BorderLayout.SOUTH);

        set_connection=new JButton("设置连接");
        set_connection.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new ConnectionJDialog();
            }
        });
        name=new JButton("设置昵称");
        name.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                new SetNameConnection();
            }
        });
        text =new TextArea(30,35);
        text.setBackground(Color.LIGHT_GRAY);

        panel1.add(set_connection);
        panel1.add(name);

        panel2.add(text);

        intertext=new JTextField(18);
        enter=new JButton("发送");
        panel4.add(intertext);
        panel4.add(enter);
        enter.addActionListener(new action_enter());
    }
    private class action_enter implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            in_text=intertext.getText();
            intertext.setText("");
        }
    }
    private class SetNameConnection extends JDialog{
        public SetNameConnection() {
            pack();
            setVisible(true);
            setTitle("昵称设置");
            setBounds(500,200,400,70);
            Container container = getContentPane();
            container.setLayout(new FlowLayout());
            setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

            JLabel jLabel = new JLabel("请输入你的昵称:");
            JTextField username = new JTextField(8);
            username.setText(sender_name);
            JButton button = new JButton("确认");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    sender_name=username.getText();
                    System.out.println(sender_name);
                }
            });
            container.add(jLabel);
            container.add(username);
            container.add(button);
        }
    }
    private class ConnectionJDialog extends JDialog {
        public ConnectionJDialog() {
            setVisible(true);
            setTitle("连接设置");
            setBounds(200,200,400,200);
            Container container = getContentPane();
            container.setLayout(new GridLayout(5,2));
            setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);

            t1=new JTextField();
            t1.setText("127.0.0.1");
            t2=new JTextField();
            t2.setText(String.valueOf(to_port));
            t3=new JTextField();
            t3.setText(String.valueOf(send_port));
            t4=new JTextField();
            t4.setText(String.valueOf(receive_port));
            JButton ok = new JButton("建立连接");
            ok.addActionListener(new action_ok());

            JLabel label1=new JLabel("目的IP:");
            JLabel label2=new JLabel("目的端口:");
            JLabel label3=new JLabel("发送端口:");
            JLabel label4=new JLabel("接收端口");
            JLabel Label5 = new JLabel("请确认-->");

            container.add(label1);
            container.add(t1);
            container.add(label2);
            container.add(t2);
            container.add(label3);
            container.add(t3);
            container.add(label4);
            container.add(t4);
            container.add(ok);

        }
        private class action_ok implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                try {
                    to_ip = InetAddress.getByName(t1.getText());
                    to_port=Integer.parseInt(t2.getText());
                    send_port=Integer.parseInt(t3.getText());
                    receive_port=Integer.parseInt(t4.getText());
                    MessageSend thread1 = new MessageSend(to_ip,to_port,sender_name,send_port,MyFrame.this);
                    thread1.start();
                    MessageReceive thread2 = new MessageReceive(receive_port,MyFrame.this);
                    thread2.start();
                } catch (UnknownHostException unknownHostException) {
                    unknownHostException.printStackTrace();
                }
            }
        }
    }
}

三. 项目打包部分

提示:其实打不打包也没多大关系

可以直接参考我的另一篇博客
文件打包教程

如果你实在搞不出来,可以去下载我的资源
这里面包含了代码项目原件(含注释版本),已经打包的jar和exe文件,已经可安装的setup文件
点击这里进入


版权声明:本文为qq_49559393原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_49559393/article/details/117754548