package socketpack_2;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.channels.SocketChannel;
import java.util.Scanner;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
* 网络 -可中断套接字
* @author Visec·Dana
*/
public class InterruptibleSocketTest {
public static void main(String[] args) {
EventQueue.invokeLater(new Thread()
{
public void run(){
JFrame frame=new InterruptibleSocketFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true); }
}
);
}
}
class InterruptibleSocketFrame extends JFrame{
private static final long serialVersionUID = 1L;
public InterruptibleSocketFrame(){
setSize(WIDTH,HEIGHT);
setTitle("InterruptibleSocketTest"); JPanel northpJPanel =new JPanel();
add(northpJPanel,BorderLayout.NORTH); messages=new JTextArea();
add(new JScrollPane(messages));
interruptilButton=new JButton("Interruptilbel");
blockingButton=new JButton("Blocking"); northpJPanel.add(interruptilButton);
northpJPanel.add(blockingButton);
interruptilButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent event){
interruptilButton.setEnabled(false);
blockingButton.setEnabled(false);
canncelButton.setEnabled(false);
connectThread=new Thread(new Runnable(){
@Override
public void run() {
try{
connectInterruptibly();
} catch (Exception e) {
messages.append("\nInterruptibleSocketTest.connectInterruptibly:\n"+e);
}
}
});
connectThread.start();
}
});
blockingButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
interruptilButton.setEnabled(false);
blockingButton.setEnabled(false);
canncelButton.setEnabled(false);
connectThread=new Thread(new Runnable(){
@Override
public void run() {
try {
connectBlocking();
} catch (IOException e) {
messages.append("InterruptibleSocketTest.connectblocking"+e);
}
}
});
connectThread.start();
}
}); canncelButton =new JButton("Cancel");
canncelButton.setEnabled(false);
northpJPanel.add(canncelButton);
canncelButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
connectThread.interrupt();
canncelButton.setEnabled(false); }
});
server =new TestServer();
new Thread(server).start(); }
/**
* 连接到服务器 终端I/O流 Interruptible
* @throws IOException
*/
public void connectInterruptibly()throws IOException{
messages.append("Interruptible:\n");
SocketChannel channel=SocketChannel.open(new InetSocketAddress("192.168.0.141", 514));
try {
in=new Scanner(channel);
while(!Thread.currentThread().isInterrupted()){
messages.append("Reading");
if(in.hasNextLine()){
String line=in.nextLine();
messages.append(line);
messages.append("\n");
}
}
}finally{
channel.close();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
messages.append("Channel closed\n");
interruptilButton.setEnabled(true);
blockingButton.setEnabled(true);
}
});
}
}
/**
* 连接到服务器 终端I/O流 Blocking
* @throws IOException
*/
public void connectBlocking()throws IOException{
messages.append("Blocking:\n\n");
Socket socket=new Socket("localhost",8189);
try {
in=new Scanner(socket.getInputStream());
while (!Thread.currentThread().isInterrupted()){
if(in.hasNextLine()){
String line=in.nextLine();
messages.append(line);
messages.append("\n");
}
}
}finally{
socket.close();
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
messages.append("Socket closed\n");
interruptilButton.setEnabled(false);
}
});
}
}
/**
* 测试服务器监听8189端口 并返回标示给客户端
*/
class TestServer implements Runnable{
@Override
public void run() {
try {
ServerSocket s=new ServerSocket(8189);
while(true){
Socket incoming=s.accept();
Runnable r=new TestServerHandler(incoming);
Thread t=new Thread(r);
t.start();
}
} catch (Exception e) {
messages.append("\nTestServer.run:\n"+e);
}
} }
class TestServerHandler implements Runnable{
public TestServerHandler(Socket i){
incoming=i;
}
@Override
public void run() {
try {
OutputStream outputStream=incoming.getOutputStream();
PrintWriter out=new PrintWriter(outputStream,true/*autoFulsh*/);
while(counter<=100){
counter++;
if(counter<=10) out.print(counter);
Thread.sleep(100);
}
incoming.close();
messages.append("Closing Server\n");
} catch (Exception e) {
messages.append("\nTestServerHandler.run:\n"+e);
} }
private Socket incoming;
private int counter;
} private Scanner in;
private JTextArea messages=null;
private JButton interruptilButton,blockingButton,canncelButton;
private Thread connectThread;
private TestServer server; public static final int WIDTH=550;
public static final int HEIGHT=400;
}

最新文章

  1. IOS下载查看PDF文件(有下载进度)
  2. php实现设计模式之 单例模式
  3. Echarts 动态折线图
  4. MySQL数据库在linux的安装,编程与操作
  5. Solr入门之(2)快速启动:第一个例子
  6. 18、(番外)匿名方法+lambda表达式
  7. tmux protocol version mismatch (client 7, server 6)
  8. java中字符串的非空判断
  9. ContactsContract.CommonDataKinds【Translated By KillerLegend】
  10. BZOJ NOI十连测 第二测 T1
  11. 同步(Synchronization)
  12. Andorid开发中如何去除标题栏title
  13. 谷歌安装器扫描时提示“需要root权限”,不用root也可以的!
  14. Java之hashCode的作用和equals方法的重构规则
  15. js的一些常用方法
  16. 工作我们是专业的之css规范
  17. 018 easygui的使用
  18. pojA Star not a Tree?
  19. UE4 Socket多线程非阻塞通信
  20. 一个简单的二叉搜索树(C++实现)

热门文章

  1. 魔兽塔防游戏android源码
  2. 飞翔的圆(Flappy Bird)游戏源码
  3. JavaScript高级 面向对象的程序设计 (一)《JavaScript高级程序设计(第三版)》
  4. linux系统下将php和mysql命令加入到环境变量中的方法
  5. html/css 关于脱离文档流的几种情况
  6. POJ C程序设计进阶 编程题#2:四大湖
  7. postgresql 入门(含java、scala连接代码)
  8. 利用JS实现的根据经纬度计算地球上两点之间的距离
  9. spring mvc中的文件上传
  10. 创业日记-关于学习Python