java实现局域网聊天工具

使用UDP协议,通过发送数据报给对方,每次启动时需要设定接收数据的端口号,发送到的ip地址和端口可以在启动后修改。

 打包好的代码:

http://115.com/file/e7jb7noz#
QQ.zip

主要思路很简单:

1.设置自己的接收端口

2.设置对方IP和端口

3.发送数据和接收数据

下面是主要代码:

import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;

public class QQFrame extends JFrame implements Runnable
{
    private JTextArea sendArea = new JTextArea(20,20);
    private JTextArea showArea = new JTextArea(10,20);
    private JButton sendButton = new JButton("发送");
    private MenuBar menuBar = new MenuBar();
    private Menu setMenu = new Menu("设置");
    private Menu helpMenu = new Menu("帮助");
    private MenuItem aboutItem = new MenuItem("关于");    
    private MenuItem setItem = new MenuItem("配置参数");
    private Thread thread = new Thread(this);
    private Config config = new Config();
    private JDialog dialog = new JDialog(this,"参数配置",true);
    private int myPort;
    QQFrame(int in_myPort)
    {
        super("局域网聊天工具");
        setResizable(false);
        myPort = in_myPort;
        setItem.addActionListener(new SetDialog(dialog,this));
        aboutItem.addActionListener(new AboutDialog(this));
        initLayout();
        sendButton.addActionListener(new SendListener(this,sendArea,showArea,config));
        thread.start();
        addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
    }
    void initLayout()
    {
        int w,h;
        w = 400;
        h = 500;
        setBounds(100,100,w,h);
        setVisible(true);
        setLayout(new GridLayout(3,1,10,15));
        JPanel jp1,jp2;
        jp1 = new JPanel();
        jp2 = new JPanel();
        JLabel jl1;
        jl1 = new JLabel("聊天记录框:");
        jp1.setLayout(null);
        jp1.add(jl1);
        jl1.setBounds(0,0,w,20);
        jp1.add(showArea);
        showArea.setBounds(0,30,w,h/3-20);
        JLabel jl2;
        jp2.setLayout(null);
        jl2 = new JLabel("发送框:");
        jp2.add(jl2);
        jl2.setBounds(0,0,w,20);
        sendArea.setBounds(0,30,w,h/3-20);
        jp2.add(sendArea);
        JPanel jp3 = new JPanel();
        add(jp1);
        add(jp2);
        add(jp3);
        jp3.add(sendButton);
        setMenuBar(menuBar);
        menuBar.add(setMenu);
        menuBar.add(helpMenu);
        helpMenu.add(aboutItem);
        setMenu.add(setItem);
        dialog.setBounds(120,150,200,250);
        JLabel IPLabel = new JLabel("对方IP");
        JLabel yourPortLabel = new JLabel("对方接收端口");
        JLabel nameLabel = new JLabel("本机名");
        JTextField IPTextField = new JTextField(15);
        JTextField yourPortTextField = new JTextField(8);
        JTextField nameTextField = new JTextField(15);
        IPTextField.setText("127.0.0.1");
        yourPortTextField.setText("879");
        nameTextField.setText("hanxi");
        
        dialog.setLayout(new GridLayout(4,2,10,10));
        dialog.add(IPLabel);
        dialog.add(IPTextField);
        dialog.add(yourPortLabel);
        dialog.add(yourPortTextField);
        dialog.add(nameLabel);
        dialog.add(nameTextField);
        dialog.add(new Panel());
        JButton sureButton = new JButton("确定");
        dialog.add(sureButton);
        sureButton.addActionListener(new SureListener(IPTextField,yourPortTextField,nameTextField,dialog,config));
    }
    public void run()
    {
        DatagramPacket dp = null;
        DatagramSocket ds = null;
        byte[] buf = new byte[1024];
        try
        {
            dp = new DatagramPacket(buf,buf.length);
            ds = new DatagramSocket(myPort);
            System.out.println("myport="+myPort);
        }
        catch (Exception e)
        {}
        while (true)
        {
            try
            {
                ds.receive(dp);
                int length = dp.getLength();
                InetAddress address = dp.getAddress();
                int port = dp.getPort();
                String message = new String(dp.getData(),0,length);
                showArea.append("收到数据长度:"+length+"\n");
                showArea.append("收到数据来自:"+address+"端口:"+port+"\n");
                showArea.append("收到数据是:"+message+"\n");
            }
            catch (Exception e)
            {
            }
        }        
    }
}

//发送事件
class SendListener implements ActionListener
{
    private JFrame QQFrame;
    private JTextArea sendArea;
    private JTextArea showArea;
    private Config config;
    SendListener(JFrame in_QQFrame, JTextArea in_sendArea, JTextArea in_showArea, Config in_config)
    {
        QQFrame = in_QQFrame;
        sendArea = in_sendArea;
        showArea =in_showArea;
        config = in_config;
        System.out.println("in_port:"+config.getyourPort());
        QQFrame.validate();
    }

    public void actionPerformed(ActionEvent e)
    {
        System.out.println("你点击了发送按钮");
        byte[] buf = sendArea.getText().trim().getBytes();
        try
        {
            InetAddress address = InetAddress.getByName(config.getIP());
            DatagramPacket dp = new DatagramPacket(buf,buf.length,address,Integer.parseInt(config.getyourPort()));
            DatagramSocket ds = new DatagramSocket();
            showArea.append("数据包目标地址:"+dp.getAddress()+"\n");
            showArea.append("数据包目标端口号:"+dp.getPort()+"\n");
            showArea.append("数据包长度:"+dp.getLength()+"\n");
            ds.send(dp);
        }
        catch (Exception ee) {}
    }
}

//配置设置
class SetDialog implements ActionListener
{
    private JDialog dialog;
    private JFrame frame;
    SetDialog(JDialog in_dialog,JFrame parent)
    {
        dialog = in_dialog;
        frame = parent;
    }
    public void actionPerformed(ActionEvent e)
    {
        dialog.validate();
        int x = frame.getX();
        int y = frame.getY();
        dialog.setBounds(x+50,y+50,200,250);
        dialog.setVisible(true);
    }
}
//关于对话框
class AboutDialog extends JDialog implements ActionListener
{
    private JFrame frame;
    private JLabel jl = new JLabel("感谢您的使用,作者:涵曦");
    AboutDialog(JFrame parent)
    {
        frame = parent;
        add(jl);
    }
    public void actionPerformed(ActionEvent e)
    {
        validate();
        int x = frame.getX();
        int y = frame.getY();
        setBounds(x+50,y+50,200,250);
        setVisible(true);
    }
}
//对话框的确定按钮事件
class SureListener implements ActionListener
{
    JTextField IPTextField;
    JTextField yourPortTextField;
    JTextField nameTextField;
    private Dialog dialog;
    private Config config;
    
    SureListener(JTextField in_IPTextField,JTextField in_yourPortTextField,JTextField in_nameTextField,JDialog in_dialog,Config in_config)
    {
        IPTextField = in_IPTextField;
        yourPortTextField = in_yourPortTextField;
        nameTextField = in_nameTextField;
        dialog = in_dialog;
        config = in_config;
    }
    public void actionPerformed(ActionEvent e)
    {
        config.set(IPTextField.getText(),yourPortTextField.getText(),nameTextField.getText());
        System.out.println("config:yourPort:"+config.getyourPort());
        dialog.setVisible(false);
    }
}
//参数
class Config
{
    private String IP="127.0.0.1";
    private String yourPort="666";
    private String name="hanxi";

    public void set(String in_IP, String in_yourPort,String in_name)
    {
        IP = in_IP;
        yourPort = in_yourPort;
        name = in_name;
    }
    public String getIP()
    {
        return IP;
    }
    public String getyourPort()
    {
        return yourPort;
    }
    public String getName()
    {
        return name;
    }
}

下面是主方法代码:

public class QQ
{
    public static void main(String args[])
    {
        if (args.length == 0)
        {
            System.out.println("请在QQ后面输入接收数据的端口号(需要空格)!");
            System.exit(0);
        }
        System.out.println(Integer.parseInt(args[0]));
        QQFrame frame = new QQFrame(Integer.parseInt(args[0]));
    }
}

设置端口和IP的图片

下面是聊天界面

 感谢 我是一林风 提供的录屏,请下载观看http://pan.baidu.com/s/1o6Hkero

作者:涵曦www.hanxi.cc
出处:hanxi.cnblogs.com
GitHub:github.com/hanxi
Email:im.hanxi@gmail.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

《 Skynet 游戏服务器开发实战》

原文地址:https://www.cnblogs.com/hanxi/p/2468990.html