zoukankan      html  css  js  c++  java
  • udp 服务器界面监听

    今天在做项目的时候,发现不同子网下是不能做UDP通信的,不知道是不是这样呢

    遇到一个错误:eclipse遇到报错:

    The type JPEGImageEncoder is not accessible due to restriction on required library C:Javajre1.6.0_07lib t.jar

    google后发现用以下方式解决:

    这个事eclipse的设置问题,它默认把这些受访问限制的API设成了ERROR,你只要把
    Windows-Preferences-Java-Complicer-Errors/Warnings
    里面的Deprecated and restricted API中的Forbidden references(access rules)选为Warning就可以编译通过了

    Java UDP服务器代码:

    package gui;
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.Scanner;
    
    import javax.swing.*;
    import javax.swing.border.Border;
    import javax.swing.border.LineBorder;
    ////
    import java.io.IOException;
    import java.net.DatagramSocket;
    import java.net.DatagramPacket;
    import java.net.InetAddress;
    
    
    public class guiHello extends JFrame implements ActionListener {
        
         private static JLabel label = new JLabel("192.168.0.3:8888");
         private static JTextArea ta=new JTextArea(30,80);
         private JFileChooser jfc=new JFileChooser(new File("."));
         private JButton bOpen,bSave;
         private JButton bListen,bOk;
         public guiHello()
         {
             super("UDP监听GUI");
             JScrollPane ps=new JScrollPane(ta);
             bOpen=new JButton("选取源文件");
             bSave=new JButton("保存变量"); 
             bListen = new JButton("开始监听");   //这个是自定义的按钮
             bOk     = new JButton("测试按钮");   
            //自定义两个 JPanel       
             JPanel panel1 = new JPanel(new BorderLayout());
             JPanel panel2 = new JPanel(new BorderLayout());
             
             //两个panel第二个背景为红色
             panel2.setBackground(Color.red);
             panel1.add(bListen, BorderLayout.CENTER);
             add(panel1);
             panel2.add(label, BorderLayout.EAST);
             add(panel2);
             
             setLayout(new FlowLayout(FlowLayout.CENTER,10,15));
            // add(label);
             add(ps);
             add(bOpen);
             add(bSave);
            // add(bListen);
             add(bOk);
             Border b = new LineBorder(Color.ORANGE, 2);
             bListen.setBorder(b);
             bOpen.addActionListener(this);
             bSave.addActionListener(this);
             bListen.addActionListener(this);
             bOk.addActionListener(this);
             setVisible(true);
             setSize(1600,1500);
             
         }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            guiHello frm=new guiHello();
            frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
    }
        
        public void actionPerformed(ActionEvent e)
        {
            JButton jbt=(JButton)e.getSource();
            if(jbt==bOpen)
            {
                int status=jfc.showOpenDialog(this);
                if(status!=JFileChooser.APPROVE_OPTION)
                    ta.setText("没有选择文件");
                else {
                    try{
                        File file1=jfc.getSelectedFile();
                        Scanner scan=new Scanner(file1);
                        String info="";
                        while(scan.hasNext())
                        {
                            String str=scan.nextLine();
                            info+=str+"
    ";
                        }
                        scan.close();
                        ta.setText(info);
                    }
                    catch(FileNotFoundException ex){
                
                    }
                    }
                
                
           }else if(jbt==bSave){
               Save();
              
           }else if(jbt==bListen){
               
             //监听函数须加try catch 
               Runnable tr = new Runnable() {
                   public void run() {
                       try {
                    Listen();
                         
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                   }
               };
               javax.swing.SwingUtilities.invokeLater(tr);
               
           }else{
               ta.setText("服务器已开启");
               test();
               
           }     
        }
        
        //每个按钮对应的函数
        private static void Save(){
             ta.setText("保存的按钮");
             
        }
        private static void Listen() throws IOException{
            //1、创建DatagramSocket;指明服务器端口
            DatagramSocket  server = new DatagramSocket(8888);
            byte[] recvBuf = new byte[1024];
       //2、创建数据包,用于接收内容。
            DatagramPacket recvPacket 
                = new DatagramPacket(recvBuf , recvBuf.length);
       //3、接收数据
            server.receive(recvPacket);
            //System.out.println(packet.getData().toString());
            //以上语句打印信息错误,因为getData()返回byte[]类型数据,直接toString会将之序列化,而不是提取字符。应该使用以下方法:
            String recvStr = new String(recvPacket.getData() , 0 , recvPacket.getLength());
            System.out.println("Hello World!" + recvStr);
            int port = recvPacket.getPort();
            //地址为InetAddress类型:(为了回发时使用)
            InetAddress inetAddr = recvPacket.getAddress();
            //地址为字符串类型:
            String strAdd = recvPacket.getAddress().getHostAddress();
            ta.setText("监听
    到客户机地址:"+strAdd+"
    端口:"+port+"
    内容:"+recvStr);
            
            
            String sendStr = "Hello ! I'm Server";
            byte[] sendBuf;
            sendBuf = sendStr.getBytes();
            DatagramPacket sendPacket 
                = new DatagramPacket(sendBuf , sendBuf.length , inetAddr , port );
            server.send(sendPacket);
       //4、关闭连接。
            server.close();
                        
                    
            
        }
        private static void test(){
             
             ta.setText("测试的按钮:bOk");
        }
    }

    Java 客户机代码:

    package socket;
    /*UDP客户端
    UDP客户端首先向被动等待联系的服务器发送一个数据报文。一个典型的UDP客户端主要执行下面三步:
    1.创建一个DatagramSocket实例,可以选择对本地地址和端口号进行设置。
    2.使用DatagramSocket类的send()方法和receive()方法发送和接受DatagramPacket实例,进行通信。
    3.通信完成后,使用DatagramSocket类的close()方法来销毁该套接字。
    
    DatagramSocket类的connect()方法确实允许指定远程地址和端口,但该功能是可选的。
    */
        import java.net.DatagramSocket;
        import java.net.InetAddress;
        import java.net.DatagramPacket;
    
        public class udpSendTest{
            
            public static void main(String[] args) throws Exception{
                //1、创建DatagramSocket用于UDP数据传送。
                //DatagramSocket socket = new DatagramSocket(); //本机地址(默认的),任何可用端口
                //本机地址(缺点是必须知道,并且必须是本地IP地址),指定本机端口  我方地址和端口
                DatagramSocket socket = new DatagramSocket(4567, InetAddress.getByName("192.168.1.103"));
                
                //2、创建需要发送的数据包
                byte[] buf = "哈利波特之死亡圣器,长岛是没有雪的2的222".getBytes();
                //对方地址和端口192.168.0.3
                DatagramPacket packet = new DatagramPacket(buf, buf.length, InetAddress.getByName("192.168.1.103"), 8888);
                
                //3、发送
                socket.send(packet);
                
                //4、关闭连接
                socket.close();
            }
        }
  • 相关阅读:
    P3396 哈希冲突 分块
    大数据之路week01--自学之面向对象java(static,this指针(初稿))
    大数据之路week01--自学之集合_2(列表迭代器 ListIterator)
    大数据之路week01--自学之集合_2(List)
    大数据之路week01--自学之集合_2(Iterator迭代器)
    大数据之路week01--自学之集合_1(Collection)
    大数据之路day05_1--初识类、对象
    大数据之路day04_2--经典bug(equals与==比较不同,break的跳出不同)
    大数据之路day04_1--数组 and for循环进阶
    eclipse断点的使用---for循环举例
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/4921270.html
Copyright © 2011-2022 走看看