/* * 2013-2-10 ニュース部分の切り出し方法を変更 このプログラムは SJIS です。 */ import java.net.*; import java.io.*; import java.util.*; import java.lang.*; import java.util.regex.*; // import java.net.InetAddress; import java.net.MulticastSocket; import java.net.DatagramPacket; import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.*; import java.io.IOException; import javax.swing.Box; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; import java.util.Locale; // メインのクラス public class awk extends JFrame implements ActionListener { static Pattern pattern, Ppattern; static Matcher matcher; static URL url; static JTextField sendTextField; static JTextArea receiveTextArea; static int WxSize = 450; static int WySize = 200; public awk() { setDefaultCloseOperation(EXIT_ON_CLOSE); addWindowListener(new WinAdapter()); } // 今後の拡張のために用意 public void actionPerformed(ActionEvent ent) { ; } // メイン public static void main(String[] args) { String version = "Ver 0.91 2013-2-10"; String path = "http://www.asahi.com/index.html"; String inputLine; String onemsgOLD = ""; int counter = 0; // フレームの生成 JFrame frame = new awk(); Container container = frame.getContentPane(); // テキストエリアの大きさなど設定 receiveTextArea = new JTextArea(10, 30); receiveTextArea.setEditable(false); receiveTextArea.setLineWrap(false); container.add(new JScrollPane(receiveTextArea), BorderLayout.CENTER); sendTextField = new JTextField(30); // タイトル生成 frame.setTitle("電光ニュース"); frame.setSize(WxSize, WySize); frame.setVisible(true); // 蛍光モジュールへのコマンド(詳細は ASTERISK の記事を参照)。 byte[] cmd2 = {(byte)0x1b, (byte)0x40, (byte)0x1f, (byte)0x58, // 輝度 50%(0x02) -> 25%(0x01) (byte)0x01, // (byte)0x1f, (byte)0x28, (byte)0x67, (byte)0x1, (byte)0x2, (byte)0x1f, (byte)0x28, (byte)0x67, (byte)0x2, (byte)0x1, (byte)0x1b, (byte)0x74, (byte)0x1, (byte)0x1f, (byte)0x1, (byte)0xc, (byte)0x1f, (byte)0x28, (byte)0x67, (byte)0x40, (byte)0x1, (byte)0x1, (byte)0x1f, (byte)0x28, (byte)0x61, (byte)0x10, (byte)0x4, (byte)0x0, (byte)0x0, (byte)0x0, (byte)0x1, (byte)0x1f, (byte)0x03, (byte)0x1f, (byte)0x73, (byte)0x02, (byte)0x1f, (byte)0x6d, (byte)0x01, (byte)0x1f, (byte)0x24, (byte)0xfe, (byte)0x0, (byte)0x0, (byte)0x0 }; String xdata = new String(cmd2); // 待ち時間は少なくてよい。 XPortTX.XPortSend(xdata, 10); // バージョン表示 receiveTextArea.append(version + "\n"); // 表示を続けるためのループ while (true) { try { url = new URL(path); } catch(MalformedURLException me) { System.out.println("MalformedURLException: " + me); } // HTML ファイルを取りに行った回数表示 receiveTextArea.append("<------- Loading: " + counter++ + "------->" + "\n"); try { // EUC でファイルを入手 InputStream in = url.openStream(); BufferedReader br = new BufferedReader(new InputStreamReader(in, "EUCJP")); // SJIS で作業用ファイルを生成 File file = new File("urlSJIS.html"); FileOutputStream os = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(os, "SJIS"); BufferedWriter bw = new BufferedWriter(osw); PrintWriter pw = new PrintWriter(bw); String lineo; while ((lineo = br.readLine()) != null) { pw.println(lineo); } pw.close(); // 作業用ファイルを開く(当該ディレクトリ内に生成される) FileInputStream is = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(is); BufferedReader bro = new BufferedReader(isr); int cnt = 0; while ((inputLine = bro.readLine()) != null) { //ニュース文字列を特定デリミタで抽出する String pt = ""; if(inputLine.matches(".*" + pt + ".*")) { // ニュース1行を特定デリミタ(正規表現)で各フィールドを配列に収容する pattern = Pattern.compile("[><]+"); String[] line = pattern.split(inputLine); for (int i = 0; i < line.length; i++) { // (HH:MM) のパターン検出 pattern = Pattern.compile(".*([0-9][0-9]:[0-9][0-9]).*"); matcher = pattern.matcher(line[i]); if (matcher.matches()) { // 収容したニュース文字列の配列の (HH:MM) の部分と、2配列前のニュース本体文字列を抽出 String onemsg = line[i - 2] + " " + line[i]; if (!onemsg.equals(onemsgOLD)) { // 動作ウィンドウにニュースを表示 receiveTextArea.append(onemsg + "\n"); //重複したニュース(ゲストと会員)がソース中に存在するので、この重複削除をする onemsgOLD = onemsg; // 蛍光管の文字列の後ろに不足空白を埋める onemsg = onemsg + " "; // 蛍光管に表示(完全に文字列が通過する時間分だけ待つ) XPortTX.XPortSend(onemsg, 10000); } } } } } pw.close(); } catch(IOException ioe) { System.out.println("IOException: " + ioe); } } } } // プログラム終了でウィンドウを閉じる。 class WinAdapter extends WindowAdapter { public void windowClosing(WindowEvent we) { System.exit(0); } } // XPort への通信をするクラス class XPortTX { public static void XPortSend (String msg, int sleep) { // XPort に接続開始 try{ // XPort の IP アドレスとポートの設定 Socket theSock = new Socket("192.168.1.71", 14000); // XPortへ接続 //System.out.println("Connencting...."); // 出力ストリーム と 入力ストリーム を設定 DataOutputStream sockout=new DataOutputStream(theSock.getOutputStream()); DataInputStream sockin =new DataInputStream(theSock.getInputStream()); //System.out.println("Connected"); sockout.write(msg.getBytes()); sockout.flush(); //System.out.println("Send"); sockout.close(); sockin.close(); theSock.close(); } catch(Exception e) { System.out.println("XPort Error!"); } // 指定時間だけウェイトする。(高速に転送すると XPort が追い付けない) try { Thread.sleep(sleep); // wait } catch (InterruptedException e) { ; } } } // プログラムエンド