对等模式-UDP聊天程序

一,介绍

  • 1,本次作为课程的一个作业展示
  • 2,想不到自己会有一天在优酷上学习
  • 3,本次主要用到了 Java 中的 net 包下的一些功能,socket,packet等,然后自己是为了测试写了一个窗口程序,以及线程来测试。
  • 4,在测试的时候记得端口号,第一个默认就好,第二个是相反的,因为是两边对调了。

二,代码演示

  • 1,具体的聊天程序
package com.NetChat;

import com.sun.javaws.util.JfxHelper;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class JFChat extends JFrame {
    DatagramPacket dp;
    DatagramSocket ds;
    InetAddress serverIp;
    int serverPort;
    int localPort;

    private JTextArea tacontent;
    private JTextField txtsay;
    private JButton btnsend;
    private JScrollPane jScrollPane;
    private JButton buttons[];


    public JFChat(){
        this.setBounds(320, 240, 400, 240);
        this.tacontent=new JTextArea();
        this.tacontent.setEditable(false);
        this.getContentPane().add(new JScrollPane(this.tacontent));
        this.btnsend=new JButton();

        JToolBar toolBar=new JToolBar();
        this.getContentPane().add(toolBar,"South");
        this.txtsay=new JTextField(30);
        toolBar.add(txtsay);
        buttons=new JButton[2];
        buttons[0]=new JButton("发送");
        buttons[1]=new JButton("下线");
        toolBar.add(buttons[0]);
        toolBar.add(buttons[1]);
        buttons[0].addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sendMsg(txtsay.getText());
                txtsay.setText("");
            }
        });
//        buttons[1].addActionListener(this);//给按钮添加事件监听,委托当前对象处理
        this.setVisible(true);

    }


    public void initConn(){
        try {
            String sip=JOptionPane.showInputDialog(this,"请输入服务器端的ip地址","127.0.0.1");
            String sport=JOptionPane.showInputDialog(this,"请输入服务器端的端口号:","4000");
            String lport=JOptionPane.showInputDialog(this,"请输入本地端的端口号:","4001");
            //类型转换
            serverIp=InetAddress.getByName(sip);
            serverPort=Integer.parseInt(sport);
            localPort=Integer.parseInt(lport);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void sendMsg(String msg){
        try {
            byte[] buff=msg.getBytes();
            //打包数据
            dp=new DatagramPacket(buff,buff.length,serverIp,serverPort);
            //构建发送方的socket(无需指明端口号)
            ds=new DatagramSocket();
            ds.send(dp);
            this.tacontent.append("self say:"+msg+"\n");
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void receive(){
        byte[] buff=new byte[1024];
        //准备接受的数据包
        DatagramPacket rdp=new DatagramPacket(buff,buff.length);
        //准备接受数据的socket
        try {
            DatagramSocket rds=new DatagramSocket(localPort);

            String msg;

            while (true){
                rds.receive(rdp);
                buff=rdp.getData();
                msg=new String(buff,0,buff.length);
                this.tacontent.append(rdp.getAddress().getHostAddress()+"say:"+msg+"\n");
            }


        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {

        JFChat chat=new JFChat();
        chat.setVisible(true);
        chat.initConn();
        chat.receive();

    }
}

  • 2,线程工具
package com.NetChat;

public class T implements Runnable {
    @Override
    public void run() {
        JFChat chat=new JFChat();
        chat.setVisible(true);
        chat.initConn();
        chat.receive();
    }
}

  • 3,测试类
package com.NetChat;

public class Test {
    public static void main(String[] args) {
        Thread t1=new Thread(new T());
        Thread t2=new Thread(new T());
        t1.start();
        t2.start();
        System.out.println("program end!");
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值