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("\nInterruptibleSocketTest.connectInterruptibly:\n"+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:\n");
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("\n");
122 }
123 }
124 }finally{
125 channel.close();
126 EventQueue.invokeLater(new Runnable() {
127 @Override
128 public void run() {
129 messages.append("Channel closed\n");
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:\n\n");
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("\n");
150 }
151 }
152 }finally{
153 socket.close();
154 EventQueue.invokeLater(new Runnable() {
155 @Override
156 public void run() {
157 messages.append("Socket closed\n");
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("\nTestServer.run:\n"+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\n");
199 } catch (Exception e) {
200 messages.append("\nTestServerHandler.run:\n"+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 }
网络---中断套接字Socket
时间: 2024-10-12 09:30:43