聊天工具小程序

注:小实验,非完成的作品.


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一样的聊天.




posted @ 2012-06-30 15:06  胡.杰  阅读(326)  评论(0编辑  收藏  举报