zoukankan      html  css  js  c++  java
  • 写一个基于UDP协议的聊天小程序

     

    分类: Java

    UDP是无连接的传输协议,所以对于写聊天程序来说不需要太多考虑同步等问题,下面是我写的一个UDP聊天程序,界面是用SWING简单做的。

    1.服务器端口(其实UDP没有什么服务器端的说法,这里只是作为区分)


    package mytest;

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

    /**
     *
     * @author hh
     *
     */

    public class UdpChatServer extends JFrame
    {
        JTextField putDiag;
        JTextArea showDiag;
        StringBuffer stb = new StringBuffer();
        
        
        public UdpChatServer()
        {
        this.setBounds(300, 300, 400, 500);
        this.setTitle("聊天界面s");

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
        
        public void showMain()
        {
        JPanel jp = new JPanel();
        jp.setLayout(new BorderLayout());
        
        showDiag = new JTextArea(20,50);
        showDiag.setEditable(false);
        putDiag = new JTextField();

        putDiag.addActionListener(new tfListener());
        
        jp.add(showDiag,BorderLayout.NORTH);
        jp.add(putDiag, BorderLayout.SOUTH);
        
        Container containerPane = getContentPane();
        containerPane.add(jp);

        setVisible(true);
        
        while(true
    //总是监听接收端口
         recieveData();
        }
        
        private class tfListener implements ActionListener
        {
        public void actionPerformed(ActionEvent e)
        {
         String str = putDiag.getText().trim();   
         sendData(str);
         stb.append("我说:"+str+" ");
         showDiag.setText(stb.toString());
         putDiag.setText("");  
        }
        }
       

        public void sendData(String str)
        {
        byte[] dataArray = new byte[1000];
        dataArray = str.getBytes();
        try
        {
         InetAddress ia = InetAddress.getLocalHost();
         DatagramSocket ds = new DatagramSocket(8889);
         DatagramPacket dp = new    DatagramPacket(dataArray,dataArray.length,ia,8881);
        
         ds.send(dp); //从自方8889端口发送到对方的8881端口
         ds.close();
        } catch (UnknownHostException e)
        {
         e.printStackTrace();
        } catch (SocketException e)
        {
         e.printStackTrace();
        } catch (IOException e)
        {
         e.printStackTrace();
        }
        }
       

        public void recieveData()
        {
        byte[] dataArray = new byte[1000];
        try
        {
         DatagramSocket ds = new DatagramSocket(8888);
         DatagramPacket dp = new DatagramPacket(dataArray,dataArray.length);
        
         ds.receive(dp); //等待接受从自方8888端口接受来的数据

         ds.close();
         stb.append(new String(dataArray).trim()+" ");
         showDiag.setText(stb.toString());
        
        } catch (SocketException e)
        {
         e.printStackTrace();
        } catch (IOException e)
        {
         e.printStackTrace();
        }
        }
        
        public static void main(String[] args)
        {
        UdpChatServer ucs = new UdpChatServer();
        ucs.showMain();
        
        }
    }


    2.客户端口


    package mytest;

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

    /**
     *
     * @author hh
     *
     */
    public class UdpChatClient extends JFrame
    {
        JTextField putDiag;
        JTextArea showDiag;
        StringBuffer stb = new StringBuffer();;
        
        public UdpChatClient()
        {
        this.setBounds(300, 300, 400, 500);
        this.setTitle("聊天界面c");
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
       

        public void showMain()
        {
        JPanel jp = new JPanel();
        jp.setLayout(new BorderLayout());
        
        showDiag = new JTextArea(20,50);
        showDiag.setEditable(false);
        putDiag = new JTextField();

        putDiag.addActionListener(new tfListener());
        
        jp.add(showDiag,BorderLayout.NORTH);
        jp.add(putDiag, BorderLayout.SOUTH);
        
        Container containerPane = getContentPane();
        containerPane.add(jp);

        setVisible(true)

     
        while(true)
         recieveData();
        }
        

        
        private class tfListener implements ActionListener
        {
        public void actionPerformed(ActionEvent e)
        {
         String str = putDiag.getText().trim();
         sendData(str);
         stb.append("我说:"+str+" ");
         showDiag.setText(stb.toString());
         putDiag.setText("");
        }
        }
        
        
        public void sendData(String str)
        {
        byte[] dataArray = new byte[1000];
        dataArray = str.getBytes();
        try
        {
         InetAddress ia = InetAddress.getLocalHost();
        
         DatagramSocket ds = new DatagramSocket(8880);
         DatagramPacket dp = new DatagramPacket(dataArray,dataArray.length,ia,8888);
         ds.send(dp); //从自方8880端口发送到对方8888端口
         ds.close();
        } catch (SocketException e)
        {
         e.printStackTrace();
        } catch (IOException e)
        {
         e.printStackTrace();
        }
        }
        
        public void recieveData()
        {
        byte[] dataArray = new byte[1000];
        try
        {
         DatagramSocket ds = new DatagramSocket(8881);
         DatagramPacket dp = new DatagramPacket(dataArray,dataArray.length);  
         ds.receive(dp); //接受从自方8881端口接受来的数据
         stb.append(new String(dataArray).trim()+" ");      showDiag.setText(stb.toString());      ds.close();     } catch (SocketException e)     {      e.printStackTrace();     } catch (IOException e)     {      e.printStackTrace();     }         }          public static void main(String[] args)     {     UdpChatClient ucc = new UdpChatClient();     ucc.showMain();        } }


    基于UDP的SOCKET编程,简单的说就是把数据写进PACKET,然后把PACKET通过指定的SOCKET传输到接收端的SOCKET,接收端拿到传过来PACKET,放进数组进行操作。

    我这里的程序的服务器端和客户端都是基于一台电脑,如果要在多台电脑上测试把recieveData里的InetAddress不要用getLocalHost(),改为其它电脑的IP就可以了。
  • 相关阅读:
    Python编码风格
    CI持续集成—记一次jenkins安装及ldap配置
    mysql主从同步失败处理
    redis优化
    sysbench
    Ubuntu12.04 Installation and Subversion(svn)
    MySQL 5.7 CLUSTER NDB 7.5 创建磁盘表 undo logfile group tablespace 内存表修改为磁盘表
    Java异步调用Future对象
    Java宝典(二)
    Java宝典(一)
  • 原文地址:https://www.cnblogs.com/bb3q/p/4514479.html
Copyright © 2011-2022 走看看