1 package socketpack_2; 2 import java.awt.BorderLayout; 3 import java.awt.EventQueue; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.io.PrintWriter; 9 import java.net.InetSocketAddress; 10 import java.net.ServerSocket; 11 import java.net.Socket; 12 import java.nio.channels.SocketChannel; 13 import java.util.Scanner; 14 import javax.swing.JButton; 15 import javax.swing.JFrame; 16 import javax.swing.JPanel; 17 import javax.swing.JScrollPane; 18 import javax.swing.JTextArea; 19 /** 20 * 网络 -可中断套接字 21 * @author Visec·Dana 22 */ 23 public class InterruptibleSocketTest { 24 public static void main(String[] args) { 25 EventQueue.invokeLater(new Thread() 26 { 27 public void run(){ 28 JFrame frame=new InterruptibleSocketFrame(); 29 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 30 frame.setVisible(true); 31 32 } 33 } 34 ); 35 } 36 } 37 class InterruptibleSocketFrame extends JFrame{ 38 private static final long serialVersionUID = 1L; 39 public InterruptibleSocketFrame(){ 40 setSize(WIDTH,HEIGHT); 41 setTitle("InterruptibleSocketTest"); 42 43 JPanel northpJPanel =new JPanel(); 44 add(northpJPanel,BorderLayout.NORTH); 45 46 messages=new JTextArea(); 47 add(new JScrollPane(messages)); 48 interruptilButton=new JButton("Interruptilbel"); 49 blockingButton=new JButton("Blocking"); 50 51 northpJPanel.add(interruptilButton); 52 northpJPanel.add(blockingButton); 53 interruptilButton.addActionListener(new ActionListener() { 54 @Override 55 public void actionPerformed(ActionEvent event){ 56 interruptilButton.setEnabled(false); 57 blockingButton.setEnabled(false); 58 canncelButton.setEnabled(false); 59 connectThread=new Thread(new Runnable(){ 60 @Override 61 public void run() { 62 try{ 63 connectInterruptibly(); 64 } catch (Exception e) { 65 messages.append(" InterruptibleSocketTest.connectInterruptibly: "+e); 66 } 67 } 68 }); 69 connectThread.start(); 70 } 71 }); 72 blockingButton.addActionListener(new ActionListener() { 73 @Override 74 public void actionPerformed(ActionEvent e) { 75 interruptilButton.setEnabled(false); 76 blockingButton.setEnabled(false); 77 canncelButton.setEnabled(false); 78 connectThread=new Thread(new Runnable(){ 79 @Override 80 public void run() { 81 try { 82 connectBlocking(); 83 } catch (IOException e) { 84 messages.append("InterruptibleSocketTest.connectblocking"+e); 85 } 86 } 87 }); 88 connectThread.start(); 89 } 90 }); 91 92 canncelButton =new JButton("Cancel"); 93 canncelButton.setEnabled(false); 94 northpJPanel.add(canncelButton); 95 canncelButton.addActionListener(new ActionListener() { 96 @Override 97 public void actionPerformed(ActionEvent e) { 98 connectThread.interrupt(); 99 canncelButton.setEnabled(false); 100 101 } 102 }); 103 server =new TestServer(); 104 new Thread(server).start(); 105 106 } 107 /** 108 * 连接到服务器 终端I/O流 Interruptible 109 * @throws IOException 110 */ 111 public void connectInterruptibly()throws IOException{ 112 messages.append("Interruptible: "); 113 SocketChannel channel=SocketChannel.open(new InetSocketAddress("192.168.0.141", 514)); 114 try { 115 in=new Scanner(channel); 116 while(!Thread.currentThread().isInterrupted()){ 117 messages.append("Reading"); 118 if(in.hasNextLine()){ 119 String line=in.nextLine(); 120 messages.append(line); 121 messages.append(" "); 122 } 123 } 124 }finally{ 125 channel.close(); 126 EventQueue.invokeLater(new Runnable() { 127 @Override 128 public void run() { 129 messages.append("Channel closed "); 130 interruptilButton.setEnabled(true); 131 blockingButton.setEnabled(true); 132 } 133 }); 134 } 135 } 136 /** 137 * 连接到服务器 终端I/O流 Blocking 138 * @throws IOException 139 */ 140 public void connectBlocking()throws IOException{ 141 messages.append("Blocking: "); 142 Socket socket=new Socket("localhost",8189); 143 try { 144 in=new Scanner(socket.getInputStream()); 145 while (!Thread.currentThread().isInterrupted()){ 146 if(in.hasNextLine()){ 147 String line=in.nextLine(); 148 messages.append(line); 149 messages.append(" "); 150 } 151 } 152 }finally{ 153 socket.close(); 154 EventQueue.invokeLater(new Runnable() { 155 @Override 156 public void run() { 157 messages.append("Socket closed "); 158 interruptilButton.setEnabled(false); 159 } 160 }); 161 } 162 } 163 /** 164 * 测试服务器监听8189端口 并返回标示给客户端 165 */ 166 class TestServer implements Runnable{ 167 @Override 168 public void run() { 169 try { 170 ServerSocket s=new ServerSocket(8189); 171 while(true){ 172 Socket incoming=s.accept(); 173 Runnable r=new TestServerHandler(incoming); 174 Thread t=new Thread(r); 175 t.start(); 176 } 177 } catch (Exception e) { 178 messages.append(" TestServer.run: "+e); 179 } 180 } 181 182 } 183 class TestServerHandler implements Runnable{ 184 public TestServerHandler(Socket i){ 185 incoming=i; 186 } 187 @Override 188 public void run() { 189 try { 190 OutputStream outputStream=incoming.getOutputStream(); 191 PrintWriter out=new PrintWriter(outputStream,true/*autoFulsh*/); 192 while(counter<=100){ 193 counter++; 194 if(counter<=10) out.print(counter); 195 Thread.sleep(100); 196 } 197 incoming.close(); 198 messages.append("Closing Server "); 199 } catch (Exception e) { 200 messages.append(" TestServerHandler.run: "+e); 201 } 202 203 } 204 private Socket incoming; 205 private int counter; 206 } 207 208 private Scanner in; 209 private JTextArea messages=null; 210 private JButton interruptilButton,blockingButton,canncelButton; 211 private Thread connectThread; 212 private TestServer server; 213 214 public static final int WIDTH=550; 215 public static final int HEIGHT=400; 216 }