Tag:java

Tag (java)'s result:

Java swing 界面卡死问题的分析与解决

0x00 问题概述 在用swing做一个项目的时候,发现程序在运行一个长时间任务的时候界面会卡死,直到任务完成。具体描述就是按下一个按钮执行任务,接着按钮就一直是按下的状态,界面卡死,直到这个任务完成才恢复正常。   0x01 问题分析 经过查阅资料,发现原来swing是线程不安全的,是单线程设计。Swing有初始线程,事件派发线程,工作线程。UI展示完毕之后初始线程就结束了,控制就交给了事件派发线程,这之后所有组件的事件行为都由事件派发线程处理,事件派发线程是调用paint和update等回调方法的线程,它还是事件监听器接口中定义的事件处理方法,也就是说只能从事件派发线程访问组件。这就是真相了,程序由事件派发线程执行一个任务,这时就要等待这个线程处理完这个任务,所以界面出现卡死现象,等这个任务结束了,事件派发线程就可以更新组件,就恢复正常了。所以,一些长时间的任务就要交给工作线程处理。   0x02 问题解决 最直接简单的方法就是把耗时长的任务单独开一个线程处理,即工作线程。   0x03 相关要点 要注意的是组件的更新(如进度条)最好别放在工作线程里,这是危险的,所以要单独开一个更新组件的线程,再把对象排到事件派发线程的队列中,这里要介绍两个函数: SwingUtilities.invokeLater():当可运行对象排在事件派发队列的队首时,就调用其run方法。其效果是允许事件派发线程调用另一个线程中的任意一个代码块。把可运行的对象放入队列后就返回。 SwingUtilities.invokeAndWait():和invokeLater一样,但是它一直等待知道已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行之前必须从一个组件获得信息,则应使用SwingUtilities.invokeAndWait()方法。   0x04 参考资料 developer.51cto.com/art/200907/136290.htm blog.csdn.net/sjf8013/article/details/7693669 blog.csdn.net/zhenshiyiqie/article/details/7605533      

lsasniff_v1.0正式开源

概述: 前段时间学习java网络编程,写了一个网络嗅探器,主要就算利用Jpcap第三方库,整理了下代码,现在正式开源。 github地址:https://github.com/theLSA/lsasniff_v1.0_linux 欢迎pr 环境: linux+jpcap+java1.8 功能简述: 1.数据包抓取 2.数据包过滤 3.数据包展示 4.数据包保存 5.数据包打开 运行效果图:   结语: v1.0版,只实现了一些基本功能,后续有空会更新,添加新功能和修复一些bug。大家有好的建议欢迎联系,求pr求star。      

lsascan_v1.0(java版)正式开源

概述: 前段时间用java写了个综合扫描器lsascan_v1.0,最近整理了下代码,正式开源,由于时间和技术问题,此版本存在一些bug,但不影响正常使用,本人会持续更新此扫描器,github地址:https://github.com/theLSA/lsascan_v1.0_linux 欢迎pr。 环境: linux+java1.8 ps:如需在windows下使用,要细微修改一些代码   功能简述: 1.ip扫描:分为单ip扫描,自定义ip段扫描,c段扫描 2.端口扫描:自定义端口范围扫描,端口集合扫描 3.嗅探:调用nmap 4.列本机进程,执行系统命令 5.爆破:调用hydra 6.显示本机信息 效果图: 结语: 一个简单的软件,原本是在windows下开发的,后来迁移到linux下,如果要在windows下使用的话也就修改一下两个调用外部程序的程序路径即可,大家有好的建议欢迎联系我,联系方式在About页面可以找到。 此版本有一些已知bug: 1.扫描ip/端口的时候界面会卡死,直到扫描结束才行,估计是线程池的问题。 2.原本在windows下可以get到局域网的mac,迁移到linux后getmac还不太完善。

Java编程中的一些问题整理(持续更新)

1.调用外部程序nbtstat时报错:java.io.IOException: Cannot run program “nbtstat”: CreateProcess error=2 原因:电脑64位,nbtstat找system32 解决:把命令改成”cmd /c C:\\Windows\\sysnative\\nbtstat.exe -a ” + ip,关于sysnative请参考http://www.lsablog.com/os/windows/magical-sysnative-folder/ **********************************************************************  

Java URL class

在java.net包中定义了URL类,该类用来处理有关URL的内容。 openStream()方法只能读取网络资源,若要既能读取又能发送数据,则要用到URL类的openConnection()方法来创建一个 URLConnection类的对象,此对象在本地机和URL指定的远程节点建立一条HTTP协议的数据通道,可进行双向数据传输 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLConnection; public class Urltest { public static void main(String[] args) throws IOException { URL baidu = new URL(“http://www.baidu.com”); System.out.println(“protocol: “+baidu.getProtocol()); System.out.println(“authority: “+baidu.getAuthority()); System.out.println(“host: “+baidu.getHost()); System.out.println(“port: “+baidu.getPort()); System.out.println(“path: “+baidu.getPath()); System.out.println(“query: “+baidu.getQuery()); System.out.println(“filename: “+baidu.getFile()); System.out.println(“ref: “+baidu.getRef()); /*URLConnection baiduconn = baidu.openConnection(); in = new BufferedReader(new InputStreamReader(baiduconn.getInputStream())); */ /*BufferedReader in = new BufferedReader(new InputStreamReader(baidu.openStream())); String inputline; while((inputline = in.readLine())!=null) System.out.println(inputline);*/ /*in.close();*/ } } 参考链接: http://www.runoob.com/java/java-url-processing.html http://blog.csdn.net/witsmakemen/article/details/6989010  

Java multicast

MulticastSocketServer.java import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; public class MulticastSocketServer { public static void main(String[] args) throws Exception { InetAddress group = InetAddress.getByName(“224.0.0.4”); //组播地址 int port = 9876; // 端口 MulticastSocket mss = null; try { mss = new MulticastSocket(port); // \1.创建一个用于发送和接收的MulticastSocket组播套接字对象 mss.joinGroup(group); //3.使用组播套接字joinGroup(),将其加入到一个组播 System.out.println(“begining send packet —” + new java.util.Date() + “)”); while (true) { String message = “Hello” + new java.util.Date(); byte[] buffer = message.getBytes(); DatagramPacket dp = new DatagramPacket(buffer, buffer.length, group, port); //2.创建一个指定缓冲区大小及组播地址和端口的DatagramPacket组播数据包对象 mss.send(dp); //4.使用组播套接字的send()方法,将组播数据包对象放入其中,发送组播数据包 // String s = new String(dp.getData(), 0, dp.getLength()); //5.解码组播数据包提取信息,并依据得到的信息作出响应 System.out.println(“发送数据包给” + group + “:” + port); Thread.sleep(1000); } } catch (IOException e) { e.printStackTrace(); } finally{ try { if(mss!=null){ mss.leaveGroup(group); mss.close(); } } catch (Exception e2) { // TODO: handle exception } } } } MulticastSocketClient.java: import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; public class MulticastSocketClient { public static void main(String[] args) throws Exception { InetAddress group = InetAddress.getByName(“224.0.0.4”); //组播地址 int port = 9876; //端口 MulticastSocket msr = null; try { msr = new MulticastSocket(port); //1.创建一个用于发送和接收的MulticastSocket组播套接字对象 msr.joinGroup(group); //3.使用组播套接字joinGroup(),将其加入到一个组播 byte[]……

java socket udp

Udpserver.java: import java.net.DatagramPacket; import java.net.DatagramSocket; public class Udpserver { public static void main(String[] args) throws Exception { System.out.println(“udp server is running……”); String str_send = “hi udpclient”; DatagramSocket se = new DatagramSocket(2016); byte[] by = new byte[1024]; DatagramPacket dp = new DatagramPacket(by,1024); while (true) { se.receive(dp); System.out.println(“the message from client is: \n”); String str_receive = new String(dp.getData(),0,dp.getLength()); System.out.println(str_receive); DatagramPacket se_send = new DatagramPacket(str_send.getBytes(),str_send.length(),dp.getAddress(),dp.getPort()); se.send(se_send); dp.setLength(1024); } //se.close(); } } Udpclient.java: import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class Udpclient { public static void main(String[] args) throws Exception { DatagramSocket ds = new DatagramSocket(); String str = “hi server”; DatagramPacket dp = new DatagramPacket(str.getBytes(),str.length(),InetAddress.getByName(“localhost”),2016); ds.send(dp); byte[] by = new byte[1024]; DatagramPacket dp2 = new DatagramPacket(by,1024); ds.receive(dp2); System.out.println(new String(by,0,dp2.getLength())); ds.close(); } }

java netwrok program—tcp

I use socket in this program. TCPServer.java: import java.io.*; import java.net.*; import java.lang.*; import java.util.*; class TCPServer { public static void main(String argv[]) throws Exception { String clientSentence; String capitalizedSentence; ServerSocket welcomeSocket = new ServerSocket(2345); while(true) { System.out.println(” Server is waitting………\n”); Socket connectionSocket = welcomeSocket.accept(); BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); clientSentence = inFromClient.readLine(); Date transfer_date = new Date(); System.out.println(“Received: ” + clientSentence + “—” + transfer_date.toString()); //receive data from client capitalizedSentence = clientSentence.toUpperCase() + ‘\n’; outToClient.writeBytes(capitalizedSentence); //send data to client } } } TCPClient.java: import java.io.*; import java.net.*; class TCPClient { public static void main(String argv[]) throws Exception { String sentence; String modifiedSentence; BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); //get input from keyboard Socket clientSocket = new Socket(“localhost”, 2345); DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); sentence = inFromUser.readLine(); outToServer.writeBytes(sentence + ‘\n’); //send data to server modifiedSentence = inFromServer.readLine(); System.out.println(“FROM SERVER: ” + modifiedSentence); //get data from server clientSocket.close(); } }

Use java to get ip and host name

java.net.* is very useful,this program I use InetAddress to get local ip,host name,baidu ip and baidu’s host name. import java.net.*; public class Localip { public static void main(String[] args) { try { InetAddress address = InetAddress.getLocalHost(); InetAddress baidu = InetAddress.getByName(“www.baidu.com”); System.out.println (address); System.out.println (baidu); System.out.println (“Host Name:” + address.getHostName()); System.out.println (“IP Address:” + address.getHostAddress()); System.out.println (“baidu host name:” + baidu.getHostName()); } catch (UnknownHostException e) { System.out.println(“Could not find local address!”); } } }