/* このプログラムは 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; 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 path = "http://www.asahi.com/index.html"; String inputLine; 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, (byte)0x02, (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); // 表示を続けるためのループ while (true) { try { url = new URL(path); } catch(MalformedURLException me) { System.out.println("MalformedURLException: " + me); } // HTML ファイルを取りに行った回数 System.out.println("<------- Loading: " + counter++ + "------->"); 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); // 1行つづ読み込んで、"(12:35)"のような部分をチェックする。 // ここでは行末尾を検出している。 while ((inputLine = bro.readLine()) != null) { //System.out.println(inputLine); pattern = Pattern.compile(""); matcher = pattern.matcher(inputLine); String rep = matcher.replaceAll(" "); // ニュース行の取り出し pattern = Pattern.compile("[> <]+"); String[] line = pattern.split(rep); for (int i = 0; i < line.length; i++) { pattern = Pattern.compile(".*([0-9][0-9]:[0-9][0-9]).*"); matcher = pattern.matcher(line[i]); if (matcher.matches()) { // 直前がどのような記事なのかを再チェック。 pattern = Pattern.compile(".*html.*"); matcher = pattern.matcher(line[i -2]); if(matcher.matches()) { String onemsg = line[i - 1] + line[i]; // コンソールに表示 System.out.println(onemsg); // ウィンドウに表示 receiveTextArea.append(onemsg + "\n"); // 蛍光管に表示(完全に文字列が通過するだけ空白を挿入。 onemsg = onemsg + " "; // 10 秒の待ち時間を取っている 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.0.55", 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) { ; } } } // プログラムエンド