⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chatclient.java

📁 一个小的聊天室程序,用java socket编写,允许多个客户端和一个服务端,默认是一个客户和一个服务端.
💻 JAVA
字号:
import java.applet.*; 
import java.awt.*; 
import java.io.*; 
import java.net.*; 
import java.awt.event.*; 
public class ChatClient extends Applet{ 
protected boolean loggedIn;//登入状态 
protected Frame cp;//聊天室框架 
protected static int PORTNUM=7777; //缺省端口号7777 
protected int port;//实际端口号 
protected Socket sock; 
protected BufferedReader is;//用于从sock读取数据的BufferedReader 
protected PrintWriter pw;//用于向sock写入数据的PrintWriter 
protected TextField tf;//用于输入的TextField 
protected TextArea ta;//用于显示对话的TextArea 
protected Button lib;//登入按钮 
protected Button lob;//登出的按钮 
final static String TITLE ="Chatroom applet>>>>>>>>>>>>>>>>>>>>>>>>"; 
protected String paintMessage;//发表的消息 
public ChatParameter Chat; 
public void init(){
	paintMessage="正在生成聊天窗口"; 
	repaint(); 
	cp=new Frame(TITLE); 
	cp.setLayout(new BorderLayout()); 
	String portNum=getParameter("port");//呢个参数勿太明 
	port=PORTNUM; 
	if (portNum!=null) //书上是portNum==null,十分有问题 
		port=Integer.parseInt(portNum); //CGI 
	ta=new TextArea(14,80); 
	ta.setEditable(false);//read only attribute 
	ta.setFont(new Font("Monospaced",Font.PLAIN,11)); 
	cp.add(BorderLayout.NORTH,ta); 
	Panel p=new Panel(); 
	Button b; //for login button 
	p.add(lib=new Button("Login")); 
	lib.setEnabled(true); 
	lib.requestFocus(); 
	lib.addActionListener(new ActionListener() { 
		public void actionPerformed(ActionEvent e){ 
			login(); 
			lib.setEnabled(false); 
			lob.setEnabled(true); 
			tf.requestFocus();//将键盘输入锁定再右边的文本框中 
		} 
	}); //for logout button 
	
	p.add(lob=new Button ("Logout")); 
	lob.setEnabled(false); 
	lob.addActionListener(new ActionListener(){ 
		public void actionPerformed(ActionEvent e){ 
			logout(); 
			lib.setEnabled(true); 
			lob.setEnabled(false); 
			lib.requestFocus(); 
			} 
		}); 
	p.add(new Label ("输入消息:")); 
	tf=new TextField(40); 
	tf.addActionListener(new ActionListener(){ 
		public void actionPerformed(ActionEvent e){ 
			if(loggedIn){ //pw.println(Chat.CMD_BCAST+tf.getText());//Chat.CMD....是咩野来? 
				int j=tf.getText().indexOf(":"); 
				if(j>0) pw.println(Chat.CMD_MESG+tf.getText()); 
				else 
					pw.println(Chat.CMD_BCAST+tf.getText()); 
				tf.setText("");//勿使用flush()? 
				} 
			} 
	}); 
	p.add(tf); 
	cp.add(BorderLayout.SOUTH,p); 
	cp.addWindowListener(new WindowAdapter(){ 
		public void windowClosing(WindowEvent e){ //如果执行了setVisible或者dispose,关闭窗口 
			ChatClient.this.cp.setVisible(false); 
			ChatClient.this.cp.dispose(); 
			logout(); 
			} 
		}); 
	
	cp.pack();//勿明白有咩用? 
				//将Frame cp放在中间 
	Dimension us=cp.getSize(), 
	them=Toolkit.getDefaultToolkit().getScreenSize(); 
	int newX=(them.width-us.width)/2; 
	int newY=(them.height-us.height)/2; 
	cp.setLocation(newX,newY); 
	cp.setVisible(true); 
	paintMessage="Window should now be visible"; 
	repaint(); 
	} //登录聊天室 
	public void login(){ 
		if(loggedIn) return; 
		try{ 
			sock=new Socket(getCodeBase().getHost(),port); 
			is=new BufferedReader(new InputStreamReader(sock.getInputStream())); 
			pw=new PrintWriter(sock.getOutputStream(),true); 
		}catch(IOException e){ 
			showStatus("Can't get socket: "+e); 
			cp.add(new Label("Can't get socket: "+e)); 
			return;} //构造并且启动读入器,从服务器读取数据,输出到文本框中 
					 //这里,长成一个线程来避免锁住资源(lockups) 
	new Thread (new Runnable(){ 
		public void run(){ 
			String line; 
			try{ 
				while(loggedIn &&((line=is.readLine())!=null)) 
					ta.appendText(line+"\n"); 
			}catch(IOException e){ 
				showStatus("我的天啊,掉线了也!!!!"); 
				return; 
			} 
			} 
		}).start(); //假定登录(其实只是打印相关信息,并没有真正登录) 
					// pw.println(Chat.CMD_LOGIN+"AppletUser"); 
	pw.println(Chat.CMD_LOGIN+"AppletUser"); 
	loggedIn =true; 
} //模仿退出的代码 
	
public void logout(){ 
	if(!loggedIn) 
		return; 
	loggedIn=false; 
	try{ 
		if(sock!=null) 
			sock.close(); 
	}catch(IOException ign){ // 异常处理哦 
	} 
} 

//没有设置stop的方法,即使从浏览器跳到另外一个网页的时候 
//聊天程序还可以继续运行 

public void paint(Graphics g){ 
	Dimension d=getSize(); 
	int h=d.height; 
	int w=d.width; 
	g.fillRect(0,0,w,2); 
	g.setColor(Color.black); 
	g.drawString(paintMessage,10,(h/2)-5); 
	} 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -