注:小实验,非完成的作品.
SERVER端:
import java.awt.*; import java.awt.event.*; import java.io.*; import javax.swing.*; import java.net.*; public class TextEditor { JFrame ft=new JFrame("TextEditor"); TextArea ta=new TextArea("",80,60); JTextField tf=new JTextField(); BorderLayout bl=new BorderLayout(20,20); // ft.setSize(800,600); JMenuBar mb=new JMenuBar(); JMenu m=new JMenu("Menu"); JMenuItem mis=new JMenuItem("Save"); JMenuItem mie=new JMenuItem("Exit"); String str="Great"; BufferedReader in; PrintWriter out; void init() { ft.setLayout(bl); Jiant jt=new Jiant(this); Record r=new Record(this); ft.setSize(800,600); mis.addActionListener(jt); mie.addActionListener(jt); ta.addKeyListener(r); tf.setActionCommand("TF"); tf.addActionListener(jt); //ta.setAutoscrolls(true); m.add(mis); m.add(mie); mb.add(m); ft.add(ta,BorderLayout.CENTER); ft.add(tf,BorderLayout.SOUTH); ft.addWindowListener(r); ft.setJMenuBar(mb); ft.setVisible(true); } public static void main(String args[]) { // TextEditor te=new TextEditor(); TextEditor te=new TextEditor(); te.init(); try { ServerSocket ss=new ServerSocket(7777); Socket client=ss.accept(); te.in=new BufferedReader(new InputStreamReader(client.getInputStream())); te.out=new PrintWriter(client.getOutputStream(),true); while(true) { te.ta.append("Client says: "+te.in.readLine()+"\n"); } } catch (Exception e) {} } } class Jiant implements ActionListener { TextEditor te; Jiant(TextEditor tec) { te=tec; } public void actionPerformed(ActionEvent e) { if((e.getActionCommand()).equals("Save")) { // Listen to Save // te.ta.insert("this is a great test",0); try { FileDialog fd=new FileDialog(te.ft,"Select or New file",FileDialog.SAVE); fd.setVisible(true); String fn=fd.getDirectory()+fd.getFile(); System.out.println(fn); te.str=te.ta.getText(); PrintWriter pw=new PrintWriter(new FileOutputStream(fn,true)); pw.print(te.str); pw.close();} catch (Exception en) {} } if((e.getActionCommand()).equals("Exit")) { // Listen to Exit // te.in.close(); // te.out.close(); te.ta.insert(te.str,0); } if((e.getActionCommand()).equals("TF")) { //output to client------ te.ta.append(te.tf.getText()+"\n"); te.out.println(te.tf.getText()); te.tf.setText(""); } } } class Record implements KeyListener ,WindowListener{ TextEditor te; Record(TextEditor tec) { te=tec; } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) { //te.str+=e.getKeyChar(); } public void windowClosing(WindowEvent e) { System.exit(0); } public void windowClosed(WindowEvent e){} public void windowIconified(WindowEvent e) {} public void windowDeiconified(WindowEvent e){} public void windowActivated(WindowEvent e){} public void windowDeactivated(WindowEvent e){} public void windowOpened(WindowEvent e) {} }
CLIENT端:
import java.io.*; import java.net.*; import java.awt.*; import java.awt.event.*; class NewClient extends Frame implements ActionListener{ BorderLayout bl=new BorderLayout(20,20); TextArea ta=new TextArea(); TextField tf=new TextField(); private Socket client; String serverAddress = "127.0.0.1"; int port = 7777; BufferedReader in; PrintWriter out; NewClient(){ try{ setLayout(bl); add(ta,BorderLayout.CENTER); add(tf,BorderLayout.SOUTH); tf.addActionListener(this); setVisible(true); client = new Socket(serverAddress,port); String check; // BufferedReader sin = new BufferedReader(new InputStreamReader(System.in)); in=new BufferedReader(new InputStreamReader(client.getInputStream())); out = new PrintWriter(client.getOutputStream(),true); while(true) { // check=sin.readLine(); // out.println("Client says: "+sin.readLine() + "/n"); check=in.readLine(); if(check.equals("exit")) break; ta.append("Message from server: " + check+"\n"); } in.close(); out.close(); client.close(); }catch(Exception e){ e.printStackTrace(); } } public static void main(String[] args){ new NewClient(); } public void actionPerformed(ActionEvent e) { String str=tf.getText(); ta.append(str+"\n"); out.println(str); tf.setText(""); } }
收获:之前都是用命令行写server端和client端,只能实现你说一句我说一句的阻塞式交流.
今天的聊天工具加入了图形界面.同时在main函数中,让输入端一直从管道监听,对方只要有输入就写到TEXTAREA中去. 然后用时间监听
TEXTFIELD,巧回车就将textField中的数据写出. 这样将输入输出分开在不同模块...使输入输出不再相互阻塞...这个就实现了我们像QQ一样的聊天.