zoukankan      html  css  js  c++  java
  • 170320网络编程 udpclient udpGroupClient

    1.udp是无连接的协议

    2.udpClient.java

    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    
    import javax.swing.*;
    
    public class udp_client extends JFrame{
        JPanel jpbottom,jpfirst,jpsecond,jpthird;
        JList jlistContent;
        JScrollPane jspContent;
        JLabel jlbAddress,jlbPort,jlbSend;
        JTextField jtxtAddress,jtxtPort,jtxtSend;
        JButton jbConnect,jbSend;
        DatagramSocket socket=null;
       boolean isExit=false;
        
        
        DefaultListModel<String> dlm=null;
        
        public udp_client(){
            this.setLocation(200,200);
            this.setSize(500,600);
            this.setLayout(new BorderLayout());
            this.setTitle("udp客户端程序");
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            
            jlistContent=new JList();
            jspContent=new JScrollPane(jlistContent);
            this.add(jspContent,BorderLayout.CENTER);
            
            jpbottom=new JPanel();
            jpbottom.setLayout(new GridLayout(3,1));
            
            jpfirst=new JPanel();
            jlbAddress=new JLabel("服务器地址:");
            jlbPort=new JLabel("服务器端口:");
            //jbConnect=new JButton("连接");
            jtxtAddress=new JTextField(15);
            jtxtPort=new JTextField(5);
            jpfirst.add(jlbAddress);
            
            jpfirst.add(jtxtAddress);
            jpfirst.add(jlbPort);
            jpfirst.add(jtxtPort);
            //jpfirst.add(jbConnect);
            jpbottom.add(jpfirst);
            
            jpsecond=new JPanel();
            jlbSend=new JLabel("发送信息:");
            jtxtSend=new JTextField(30);
            jbSend=new JButton("发送");
            
            jbSend.addActionListener(new ActionListener(){
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    //先获取发送地址和发送端口号
                    //创建一个临时的套接字进行发送,不需要指定端口,任何一个都行
                    DatagramSocket sendSocket=null;
                    try {
                        sendSocket=new DatagramSocket();
                        String sendAddress=jtxtAddress.getText().trim();
                        int sendPort=Integer.parseInt(jtxtPort.getText().trim());
                        InetAddress address=InetAddress.getByName(sendAddress);
                        
                        
                        byte[] sendbuffer=jtxtSend.getText().trim().getBytes();
                        
                        DatagramPacket sendPacket=new DatagramPacket(sendbuffer,0,sendbuffer.length,address,sendPort);
                        sendSocket.send(sendPacket);
                        
                    } catch (Exception e1) {
                        // TODO Auto-generated catch block
                        setJlist("发送信息失败!!!!"+e1.getMessage());
                    }finally{
                        sendSocket.close();
                    }
                }
                
            });
            
            
            jpsecond.add(jlbSend);
            jpsecond.add(jtxtSend);
            jpsecond.add(jbSend);
            jpbottom.add(jpsecond);
            
            this.add(jpbottom,BorderLayout.SOUTH);
            
            this.addWindowListener(new WindowListener(){
    
                @Override
                public void windowOpened(WindowEvent e) {
                    // TODO Auto-generated method stub
                    
                }
    
                @Override
                public void windowClosing(WindowEvent e) {
                    // TODO Auto-generated method stub
                    isExit=true;
                    if(socket!=null){
                        try{
    
                            socket.close();
                        }catch(Exception e2){
                            e2.printStackTrace();
                        }
                    }
                }
    
                @Override
                public void windowClosed(WindowEvent e) {
                    // TODO Auto-generated method stub
                    
                }
    
                @Override
                public void windowIconified(WindowEvent e) {
                    // TODO Auto-generated method stub
                    
                }
    
                @Override
                public void windowDeiconified(WindowEvent e) {
                    // TODO Auto-generated method stub
                    
                }
    
                @Override
                public void windowActivated(WindowEvent e) {
                    // TODO Auto-generated method stub
                    
                }
    
                @Override
                public void windowDeactivated(WindowEvent e) {
                    // TODO Auto-generated method stub
                    
                }
            });
            
            
            dlm=new DefaultListModel<String>();
            
            try {
                socket=new DatagramSocket(8001);
                setJlist("初始化socket开启成功");
                
                //接受信息
                new Thread(new Runnable(){
    
                    @Override
                    public void run() {
                        // TODO Auto-generated method stub
                        while(!isExit){
                            byte[] buffer=new byte[1024];
                            //字节数组+整数值
                            DatagramPacket udpPacket=new DatagramPacket(buffer,buffer.length);
                            
                            try {
                                socket.receive(udpPacket);
                                //收到的数据
                                //将收到的字节转化为字符串,添加偏移量
                                String receiveData=new String(udpPacket.getData(),0,udpPacket.getLength());
                                setJlist(receiveData);
                            } catch (IOException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                                setJlist("接受数据失败");
                                socket.close();
                                break;
                            }
                        }
                        
                    }
                    
                }).start();
            } catch (SocketException e1) {
                // TODO Auto-generated catch block
                socket=null;
                setJlist("绑定8000端口失败!!!!!"+e1.getMessage());
            }
            this.setVisible(true);
        }
        
        private void setJlist(String info){
            dlm.addElement(info);
            jlistContent.setModel(dlm);
        }
        public static void main(String[]args){
            new udp_client();
        }
        
    }

    3.UdpGroupClient.java

    package zhbit.udp.group;
    
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.MulticastSocket;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JList;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTextField;
    
    
    
    public class UdpGroupClient extends JFrame {
         String groupAddress="230.0.0.1";
         int groupPort=8000;
         JList<String> jlist;
         JScrollPane jsp;
         JPanel jp1,jp2,jp3;
         JLabel jbl1,jbl2,jbl3,jbl4,jbl5;
         JTextField jtx,jtxIP,jtxPort;
         JButton jbSend,jbJoin,jbExit;
         DefaultListModel<String> dlm=null;
         MulticastSocket socket=null;
         boolean isExit=false;
       public UdpGroupClient()
       {
             this.setSize(500,600);//大小
                this.setTitle("聊天窗体");
                this.setLocation(100, 100);//显示位置
                this.setLayout(new BorderLayout());//布局
                this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);//关闭操作
                jlist=new JList<String>();
                jsp=new JScrollPane(jlist);
                
                this.add(jsp,BorderLayout.CENTER);
                
                jp1=new JPanel();
                jp1.setLayout(new GridLayout(3,1));
                
                jp2=new JPanel();
                jbl1=new JLabel("发送地址:");
                jbl2=new JLabel("发送端口:");
                
                jbJoin=new JButton("加入");
                jbExit=new JButton("退出");
                
                jbExit.addActionListener(new ActionListener() {
                    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        try {
                            socket.leaveGroup(InetAddress.getByName(groupAddress));
                        } catch (UnknownHostException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        } catch (IOException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                    }
                });
                
                jbJoin.addActionListener(new ActionListener() {
                    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        try {
                            InetAddress address=InetAddress.getByName(groupAddress);
                            socket.joinGroup(address);
                            socket.setLoopbackMode(false); 
                            new Thread(new Runnable() {
                                
                                @Override
                                public void run() {
                                    // TODO Auto-generated method stub
                                    while(!isExit)
                                    {
                                        byte[] buffer=new byte[1024];
                                         DatagramPacket udpPackage=new DatagramPacket(buffer,buffer.length);
                                         try {
                                            socket.receive(udpPackage);
                                            //把接收到的数据转化为字符串
                                            String receiveInfo=new String(udpPackage.getData(),0,udpPackage.getLength());
                                            setJList("收到组播信息:"+receiveInfo);
                                        } catch (IOException e) {
                                            // TODO Auto-generated catch block
                                            setJList("接收数据失败!!!!");
                                            break;
                                        }
                                    }
                                }
                            }).start();
                        } catch (Exception e1) {
                            // TODO Auto-generated catch block
                            setJList("加入组播组的失败!!!!");
                            
                        }
                        
                    }
                });
                
                
                jbSend=new JButton("发送");
                jbSend.addActionListener(new ActionListener() {
                    
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // TODO Auto-generated method stub
                        DatagramSocket sendSocket=null;
                        try {
                            sendSocket=new DatagramSocket();
                            InetAddress address=InetAddress.getByName(groupAddress);
                            byte[] sendBuffer=jtx.getText().trim().getBytes();
                            DatagramPacket pack=new DatagramPacket(sendBuffer,0,sendBuffer.length,address,groupPort);
                            sendSocket.send(pack);//发送数据
                            
                        } catch (Exception ex) {
                            // TODO Auto-generated catch block
                            setJList("发送数据失败!!!"+ex.getMessage());
                            
                        }
                        finally
                        {
                            sendSocket.close();
                        }
                    }
                });
                
                
                jp2.add(jbJoin);
                
                jp2.add(jbExit);
                
                
                jp1.add(jp2);
                
                jp3=new JPanel();
                jbl3=new JLabel("发送信息:");
                jtx=new JTextField(30);
                
         
                jp3.add(jbl3);
                jp3.add(jtx);
                jp3.add(jbSend);
                jp1.add(jp3);
                
                
                this.add(jp1,BorderLayout.SOUTH);
                this.setVisible(true);
                
                
                this.addWindowListener(new WindowListener() {
                    
                    @Override
                    public void windowOpened(WindowEvent e) {
                        // TODO Auto-generated method stub
                        
                    }
                    
                    @Override
                    public void windowIconified(WindowEvent e) {
                        // TODO Auto-generated method stub
                        
                    }
                    
                    @Override
                    public void windowDeiconified(WindowEvent e) {
                        // TODO Auto-generated method stub
                        
                    }
                    
                    @Override
                    public void windowDeactivated(WindowEvent e) {
                        // TODO Auto-generated method stub
                        
                    }
                    
                    @Override
                    public void windowClosing(WindowEvent e) {
                        // TODO Auto-generated method stub
                        isExit=true;
                        try {
                            //退出组播组
                            socket.leaveGroup(InetAddress.getByName(groupAddress));
                            socket.close();
                        } catch (UnknownHostException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        } catch (IOException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        
                        
                    }
                    
                    @Override
                    public void windowClosed(WindowEvent e) {
                        // TODO Auto-generated method stub
                        
                    }
                    
                    @Override
                    public void windowActivated(WindowEvent e) {
                        // TODO Auto-generated method stub
                        
                    }
                });
                
                dlm=new DefaultListModel<String>();
                
                try {
                    socket=new MulticastSocket(groupPort);
                    
                    
                    
                } catch (IOException e1) {
                    // TODO Auto-generated catch block
                    setJList("初始化组播socket失败!!!"+e1.getMessage());
                }
                
                
       }
       private void setJList(String info)
         {
             dlm.addElement(info);
             jlist.setModel(dlm);
         }
       
       public static void main(String[] args) {
            // TODO Auto-generated method stub
           new UdpGroupClient();
        }
    }

     

    4.Unrecognized Windows Sockets error: 0: Cannot bind

    端口被占用

  • 相关阅读:
    android音量知识总结
    android设置dialog透明度,黑暗度的方法
    获得图片资源总结
    Fragment使用案例
    activity主窗口与软键盘的交互模式
    AndroidManifest.xml中android:configChanges的简介
    2G,3G和4G网络类型了解
    安卓权限大全
    Spring
    多线程
  • 原文地址:https://www.cnblogs.com/liao13160678112/p/6589808.html
Copyright © 2011-2022 走看看