亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? qq.java

?? 一個(gè)用純java語(yǔ)言 寫的 QQ 客戶 端
?? JAVA
字號(hào):
/**
 * QQ聊天室客戶端
 */
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.util.*;
import java.awt.geom.*;

public class Qq {
	/**
	 * 主方法:啟動(dòng)登陸線程
	 */
	public static void main(String[] args) throws Exception {
		Thread login = new LoginThread();
		login.start();
	}
}

/**
 * 登陸線程
 */
class LoginThread extends Thread implements Protocol {
	private JFrame loginf;

	private JTextField t;

	public void run() {
		/*
		 * 設(shè)置登陸界面
		 */
		loginf = new JFrame();
		loginf.setSize(400, 150);
		loginf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		loginf.setTitle(SOFTWARE + " - 登陸");

		t = new JTextField("Version " + VERSION + "        By Lindan");
		t.setHorizontalAlignment(JTextField.CENTER);
		t.setEditable(false);
		loginf.getContentPane().add(t, BorderLayout.SOUTH);

		JPanel loginp = new JPanel(new GridLayout(3, 2));
		loginf.getContentPane().add(loginp);

		JTextField t1 = new JTextField("登陸名:");
		t1.setHorizontalAlignment(JTextField.CENTER);
		t1.setEditable(false);
		loginp.add(t1);

		final JTextField loginname = new JTextField("");
		loginname.setHorizontalAlignment(JTextField.CENTER);
		loginp.add(loginname);

		JTextField t2 = new JTextField("服務(wù)器IP:");
		t2.setHorizontalAlignment(JTextField.CENTER);
		t2.setEditable(false);
		loginp.add(t2);

		final JTextField loginIP = new JTextField(DEFAULT_IP);
		loginIP.setHorizontalAlignment(JTextField.CENTER);
		loginp.add(loginIP);

		/*
		 * 監(jiān)聽(tīng)退出按鈕(匿名內(nèi)部類)
		 */
		JButton b1 = new JButton("退  出");
		loginp.add(b1);
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		final JButton b2 = new JButton("登  陸");
		loginp.add(b2);

		loginf.setVisible(true);

		/**
		 * 監(jiān)聽(tīng)器,監(jiān)聽(tīng)"登陸"Button的點(diǎn)擊和TextField的回車
		 */
		class ButtonListener implements ActionListener {
			private Socket s;

			public void actionPerformed(ActionEvent e) {
				if (checkName(loginname.getText())) {
					try {
						s = new Socket(loginIP.getText(), Integer
								.parseInt(DEFAULT_PORT));
						/*
						 * 連接服務(wù)器
						 */
						try {
							InputStream is = s.getInputStream();
							InputStreamReader ir = new InputStreamReader(is,
									"GBK");
							BufferedReader in = new BufferedReader(ir);
							OutputStream os = s.getOutputStream();
							OutputStreamWriter or = new OutputStreamWriter(os,
									"GBK");
							PrintWriter out = new PrintWriter(or);
							out.println(VERSION);
							out.flush();
							out.println(loginname.getText());
							out.flush();
							String ver;
							if (!(ver = in.readLine()).equals(VERSION)) {
								throw new VersionException(ver);
							}
							if (in.readLine().equals(USER_EXIST)) {
								throw new ExistException();
							}
							/*
							 * 啟動(dòng)聊天線程
							 */
							Thread chat = new ChatThread(loginname.getText(),
									s, in, out);
							loginf.setVisible(false);
							loginf.setEnabled(false);
							chat.start();
						} catch (IOException e1) {// 流操作異常
							t.setText("通訊失敗,請(qǐng)重試!");
							try {
								s.close();
							} catch (IOException e2) {
							}
						} catch (VersionException e3) {// 用戶存在異常(接口中定義)
							t.setText(e3.getMessage());
							try {
								s.close();
							} catch (IOException e4) {
							}
						} catch (ExistException e5) {// 用戶存在異常(接口中定義)
							t.setText(e5.getMessage());
							try {
								s.close();
							} catch (IOException e6) {
							}
						}
					} catch (IOException e7) {// Socket連接服務(wù)器異常
						t.setText("連接服務(wù)器失敗,請(qǐng)重試!");
					}
				}
			}
		}
		ButtonListener bl = new ButtonListener();
		b2.addActionListener(bl);
		loginname.addActionListener(bl);
		loginIP.addActionListener(bl);
	}

	/**
	 * 判斷登陸名是否有效
	 */
	private boolean checkName(String name) {
		if (name.length() < NAME_MIN) {
			t.setText("錯(cuò)誤:登陸名不能小于" + NAME_MIN + "字符");
			return false;
		}
		if (name.length() > NAME_MAX) {
			t.setText("錯(cuò)誤:登陸名不能大于" + NAME_MAX + "字符");
			return false;
		}
		if (name.indexOf(" ") > -1) {
			t.setText("錯(cuò)誤:登陸名不能包含空格");
			return false;
		}
		for (int i = 0; i < FORBID_WORDS.length; i++) {
			if (name.indexOf(FORBID_WORDS[i]) > -1) {
				t.setText("錯(cuò)誤:登陸名不能包含敏感信息");
				return false;
			}
		}
		return true;
	}
}

/**
 * 聊天線程
 */
class ChatThread extends Thread implements Protocol {
	private Map users = new HashMap();

	private String name;

	private Socket s;

	private BufferedReader in;

	private PrintWriter out;

	private JComboBox cb;

	private JFrame f;

	private JTextArea ta;

	private JTextField tf;

	private static long time;// 上一條信息的發(fā)出時(shí)間

	private static int total;// 在線人數(shù)統(tǒng)計(jì)

	public ChatThread(String name, Socket s, BufferedReader in, PrintWriter out) {
		this.name = name;
		this.s = s;
		this.in = in;
		this.out = out;
	}

	public static BounceFrame hyn = new BounceFrame();

	public static BounceFrame hye = new BounceFrame();

	public static BounceFrame hyw = new BounceFrame();

	void runt() {
		hyw.addBall();
		hye.addBall();
		hyn.addBall();
		BounceFrame.counter++;
	}

	public void run() {
		/*
		 * 設(shè)置聊天室窗口界面
		 */
		f = new JFrame();
		f.setSize(600, 400);
		f.setTitle(SOFTWARE + " - " + name + "     當(dāng)前在線人數(shù):" + ++total);
		f.setLocation(300, 200);
		ta = new JTextArea();
		JScrollPane sp = new JScrollPane(ta);
		ta.setEditable(false);
		tf = new JTextField();
		cb = new JComboBox();
		cb.addItem("All");
		JPanel pl = new JPanel(new BorderLayout());
		pl.add(cb);
		JPanel p = new JPanel(new BorderLayout());
		p.add(pl, BorderLayout.WEST);
		p.add(tf);
		f.getContentPane().add(p, BorderLayout.SOUTH);
		f.getContentPane().add(sp);
		f.getContentPane().add(BounceFrame.canvas, BorderLayout.NORTH);
		/**
		 * 監(jiān)聽(tīng)關(guān)閉按鈕
		 */
		class MyWindowListener implements WindowListener {
			public void windowActivated(WindowEvent e) {
			}

			public void windowClosed(WindowEvent e) {
			}

			public void windowClosing(WindowEvent e) {
				/*
				 * 向服務(wù)器發(fā)送退出信息
				 */
				out.println(SYSTEM_MSG + USER_LOGOUT);
				out.flush();
				try {
					s.close();
				} catch (IOException e1) {
				}
				System.exit(0);
			}

			public void windowDeactivated(WindowEvent e) {
			}

			public void windowDeiconified(WindowEvent e) {
			}

			public void windowIconified(WindowEvent e) {
			}

			public void windowOpened(WindowEvent e) {
			}
		}
		MyWindowListener wl = new MyWindowListener();
		f.addWindowListener(wl);

		/**
		 * 接收服務(wù)器發(fā)送的信息
		 */
		class GetMsgThread extends Thread {
			public void run() {
				try {
					String msg, name;
					while (!s.isClosed()) {
						/*
						 * 不斷接受服務(wù)器信息,外層循環(huán)防止讀到null跳出循環(huán)
						 */
						while (!s.isClosed() && (msg = in.readLine()) != null) {
							msg = specialMsg(msg);// 系統(tǒng)信息處理
							if (msg.startsWith(MSG_FROM)) {
								msg = msg.replaceFirst(MSG_FROM, "");
								name = msg.substring(0, msg.indexOf(NAME_END));
								msg = msg.replaceFirst(name + NAME_END, "");
								ta.append(name + " 悄悄地對(duì)你說(shuō): " + msg + "\n");
							} else if (msg.contains(NAME_END)) {
								name = msg.substring(0, msg.indexOf(NAME_END));
								msg = msg.replaceFirst(name + NAME_END, "");
								ta.append(name + " 說(shuō): " + msg + "\n");// 在窗口顯示信息
							} else {
								ta.append(msg + "\n");
							}
							ta.setCaretPosition(ta.getText().length());
						}
					}
				} catch (Exception e) {
					out.println(SYSTEM_MSG + USER_LOGOUT);// 當(dāng)異常產(chǎn)生時(shí)向系統(tǒng)發(fā)出退出信息
				} finally {
					try {
						s.close();
					} catch (IOException e) {
					}
				}
			}
		}
		GetMsgThread gt = new GetMsgThread();
		gt.start();

		/*
		 * 監(jiān)聽(tīng)用戶在窗口輸入的信息(匿名內(nèi)部類)
		 */
		tf.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				String msg = e.getActionCommand();
				if (isAllowed(msg, null)) {
					sendMsg((String) cb.getSelectedItem(), msg, true);
					tf.setText(null);
					runt();
				}
			}
		});

		f.setVisible(true);
	}

	/**
	 * 處理系統(tǒng)信息
	 */
	private String specialMsg(String msg) {
		if (msg.startsWith(SYSTEM_MSG)) {
			msg = msg.replaceFirst(SYSTEM_MSG, "");
			/*
			 * 當(dāng)有人進(jìn)入聊天室
			 */
			if (msg.startsWith(ADD_USER)) {
				msg = msg.replaceFirst(ADD_USER, "");
				cb.addItem(msg);
				// users.put(msg, new ChatWindow(msg));
				total++;
				msg += " 進(jìn)入聊天室";
			}
			/*
			 * 當(dāng)有人離開(kāi)聊天室
			 */
			else if (msg.startsWith(DELETE_USER)) {
				msg = msg.replaceFirst(DELETE_USER, "");
				cb.removeItem(msg);
				// ((ChatWindow) users.get(msg)).tas.append(msg + " 退出聊天室\n");
				users.remove(msg);
				total--;
				msg += " 退出聊天室";
			}
			/*
			 * 登陸時(shí)獲得的在線用戶列表信息
			 */
			else if (msg.startsWith(EXIST_USERS)) {
				msg = msg.replaceFirst(EXIST_USERS, "");
				cb.addItem(msg);
				// users.put(msg, new ChatWindow(msg));
				total++;
				msg += " 正在聊天室";
			}
			/*
			 * 即時(shí)顯示在線人數(shù)
			 */
			f.setTitle(SOFTWARE + " - " + name + "     當(dāng)前在線人數(shù):" + total);
			return msg;
		}
		return msg;
	}

	/**
	 * 檢查信息是否允許發(fā)送,包括檢查敏感詞匯/空信息/刷屏
	 */
	private boolean isAllowed(String msg, String msgto) {
		/*
		 * 過(guò)濾空信息
		 */
		if (msg.length() == 0)
			return false;
		String errmsg = null;
		/*
		 * 過(guò)濾敏感詞匯
		 */
		for (int i = 0; i < FORBID_WORDS.length; i++) {
			if (msg.indexOf(FORBID_WORDS[i]) > -1) {
				errmsg = "包含敏感信息,信息發(fā)送失敗!\n";
				break;
			}
		}
		long timenow = (new Date()).getTime();// 獲得當(dāng)前時(shí)間信息
		/*
		 * 防刷屏
		 */
		if (timenow - time < TIME_BETWEEN_MSG * 1000) {
			errmsg = "發(fā)送信息的最短間隔為" + TIME_BETWEEN_MSG + "秒,請(qǐng)勿刷屏!\n";
		}
		if (errmsg == null) {
			time = timenow;// 記錄發(fā)送信息時(shí)間
			return true;
		} else if (msgto == null)
			ta.append(errmsg);

		return false;
	}

	private void sendMsg(String name1, String msg, boolean isRoomShow) {
		out.println(name1 + NAME_END + msg);
		out.flush();
		if (name1.equals("All"))
			ta.append("我 說(shuō): " + msg + "\n");
		else {
			if (isRoomShow)
				ta.append("我悄悄地對(duì) " + name1 + " 說(shuō): " + msg + "\n");
		}
	}
}

/** 顯示的物體 */
class Ball {
	public int n = 0;

	public Ball(Component c) {
		canvas = c;
	}

	public Ball(Component c, Color color) {
		canvas = c;
		this.color = color;
	}

	/** 選擇移動(dòng)的物體 */
	public void draw(Graphics2D g2) {
		if (color != null)
			g2.setColor(color);

		int n = BounceFrame.counter % 4;
		s = BounceFrame.counter % 3;
		if (n == 0)
			g2.drawString(ch[s], x + 8, y + 8);
		if (n == 2)
			g2.drawLine(x, y, x + 10, y + 10);
		if (n == 3)
			g2.fill3DRect(x, y, XSIZE, YSIZE, raised);
		if (n == 1)
			g2.fill(new Ellipse2D.Double(x, y, XSIZE, YSIZE));
	}

	/** 控制移動(dòng) */
	public void move() {
		if (x + XSIZE >= canvas.getWidth() && y + YSIZE >= canvas.getHeight()) {
			y -= dy;
			n = 1;
			canvas.repaint();
			return;
		}
		if (x + XSIZE >= canvas.getWidth() && y + YSIZE < canvas.getHeight()) {

			if (n == 1) {
				if (y == 12) {
					x -= dx;

				}
				y -= dy;
			}
			canvas.repaint();
			return;
		}
		if (x + XSIZE < canvas.getWidth() && y + YSIZE >= canvas.getHeight()) {
			x += dx;
			canvas.repaint();
			return;
		}
		if (x + XSIZE < canvas.getWidth() && y + YSIZE < canvas.getHeight()) {
			if (n == 0)
				y += dy;
			if (n == 1)
				x -= dx;
			canvas.repaint();
			return;
		}

	}

	private Component canvas;

	private Color color;

	private static final int XSIZE = 10;

	private static final int YSIZE = 10;

	private static final boolean raised = true;

	private int x = 0;

	private int y = 0;

	private int dx = 2;

	private int dy = 2;

	String[] ch = { "郭", "志", "勇" };

	public static int s = 2;
}

/** 顯示移動(dòng)物體的線程 */
class BallThread extends Thread {

	public BallThread(Ball aBall) {
		b = aBall;
	}

	public void run() {

		try {

			for (int i = 1; i <= 696; i++) {
				b.move();
				sleep(10);
			}
		} catch (InterruptedException iex) {
			iex.printStackTrace();
		}
	}

	private Ball b;

}

/** 生成2D圖行 */
class BallCanvas extends JPanel {

	public void add(Ball b) {
		balls.add(b);
	}

	public void paintComponent(Graphics g) {

		super.paintComponent(g);

		Graphics2D g2 = (Graphics2D) g;

		for (int i = 0; i < balls.size(); i++) {
			Ball b = (Ball) balls.get(i);
			b.draw(g2);
		}

	}

	private ArrayList balls = new ArrayList();

}

/** 顯示窗口 */
class BounceFrame extends JPanel {

	/** 產(chǎn)生的動(dòng)作 */
	public void addBall() {
		Ball b = new Ball(canvas, colors[counter % colors.length]);
		canvas.add(b);
		BallThread thread = new BallThread(b);
		thread.start();
	}

	public static BallCanvas canvas = new BallCanvas();

	public static final int WIDTH = 450;

	public static final int HEIGHT = 350;

	private Color[] colors = { Color.blue, Color.magenta, Color.green,
			Color.orange, Color.red, Color.yellow, Color.pink };

	public static int counter = 0;

}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕中文字幕在线一区 | 亚洲国产精品人人做人人爽| 欧美乱熟臀69xxxxxx| 国产美女一区二区| 亚洲福中文字幕伊人影院| 亚洲欧洲综合另类| 26uuu亚洲综合色欧美| 91福利在线播放| 成人黄页毛片网站| 国产一区二区视频在线| 精彩视频一区二区三区| 亚洲成人黄色小说| 综合久久给合久久狠狠狠97色| 欧美成人r级一区二区三区| 91国偷自产一区二区开放时间 | 久久国产精品无码网站| 一区二区三区四区高清精品免费观看| 亚洲精品一区二区三区福利| 欧美剧在线免费观看网站| 欧美精品九九99久久| 欧美一级欧美三级在线观看| 91麻豆国产香蕉久久精品| 国产盗摄精品一区二区三区在线| 欧美aaa在线| 视频一区欧美精品| 亚洲午夜视频在线观看| 婷婷综合久久一区二区三区| 亚洲一区二区三区小说| 亚洲综合色视频| 日本女人一区二区三区| 肉肉av福利一精品导航| 久久99精品久久久久久| av激情综合网| 91影视在线播放| 777奇米四色成人影色区| 欧美另类一区二区三区| 久久久久久久av麻豆果冻| 久久综合九色综合欧美亚洲| 国产精品久久久久久久午夜片| 一二三区精品视频| 麻豆精品国产91久久久久久| 久久99久久99| caoporm超碰国产精品| 欧美日韩精品一区二区天天拍小说| 欧美日韩日日骚| 欧美高清www午色夜在线视频| 欧美精品一区二区高清在线观看| 中文字幕一区二区三区四区不卡| 中文字幕制服丝袜一区二区三区 | 狠狠色丁香婷婷综合| 国产老妇另类xxxxx| 成人一区二区视频| av在线不卡电影| 在线播放视频一区| 中文字幕日本不卡| 蜜臀久久久久久久| 91亚洲精品久久久蜜桃网站 | 精品欧美乱码久久久久久| 国产精品电影一区二区| 毛片一区二区三区| 一本久久综合亚洲鲁鲁五月天| 欧美性生活大片视频| 91精品黄色片免费大全| 日韩久久一区二区| 国产麻豆精品在线| 日韩精品自拍偷拍| 国产精品久久国产精麻豆99网站 | 一本一本大道香蕉久在线精品 | 日韩亚洲电影在线| 337p粉嫩大胆色噜噜噜噜亚洲| 悠悠色在线精品| 美女网站视频久久| 在线观看国产精品网站| 日韩欧美一二三四区| 一区二区三区久久| 成人av影视在线观看| 久久综合一区二区| 日本不卡的三区四区五区| 欧美日韩中字一区| 依依成人精品视频| 91一区二区在线| 国产精品的网站| 成人美女视频在线观看| 欧美精品一区二区久久久 | 日韩欧美一级片| 亚洲妇女屁股眼交7| 在线观看亚洲一区| 亚洲精品国产精品乱码不99| 成人爽a毛片一区二区免费| 久久综合久久综合久久综合| 免费在线观看不卡| 欧美一级日韩免费不卡| 日韩精品国产欧美| 这里只有精品视频在线观看| 亚洲国产精品久久人人爱| 色婷婷精品大在线视频 | 99久久综合99久久综合网站| 中文一区二区在线观看| 亚洲高清免费一级二级三级| 欧美视频第二页| 亚洲va欧美va天堂v国产综合| 欧洲亚洲精品在线| 亚洲综合区在线| 欧美午夜片在线观看| 亚洲国产成人高清精品| 91电影在线观看| 亚洲香蕉伊在人在线观| 91精品国产综合久久精品图片| 午夜欧美一区二区三区在线播放| 在线免费不卡视频| 亚洲成人av电影| 91精品国产色综合久久不卡蜜臀 | 亚洲二区在线观看| 欧美日韩美女一区二区| 天堂成人免费av电影一区| 91精品欧美久久久久久动漫| 久久er99热精品一区二区| 国产三级一区二区三区| 麻豆成人在线观看| 久久亚洲捆绑美女| 国产宾馆实践打屁股91| 久久婷婷国产综合精品青草| 国产精品1024| 综合欧美一区二区三区| 一本色道**综合亚洲精品蜜桃冫| 亚洲v日本v欧美v久久精品| 欧美成人欧美edvon| 国产盗摄精品一区二区三区在线 | 国产乱妇无码大片在线观看| 国产精品久久久久三级| 欧美性三三影院| 精品一区二区免费在线观看| 国产精品日韩成人| 国产成人一级电影| 亚洲精品日日夜夜| 日韩限制级电影在线观看| 成人sese在线| 午夜日韩在线观看| 国产欧美一区二区三区沐欲| 国产美女视频91| 一区二区三区av电影 | 一二三区精品福利视频| 日韩精品一区二区三区在线 | 久久看人人爽人人| 91麻豆视频网站| 蜜桃视频一区二区| 中文字幕亚洲区| 91精品国产欧美一区二区 | 国产精品全国免费观看高清| 欧美亚洲一区三区| 国产精品中文字幕日韩精品| 亚洲一区在线播放| 国产欧美日本一区视频| 精品视频在线免费观看| 国产馆精品极品| 亚洲高清免费视频| 国产精品久久久久婷婷二区次| 欧美精品日韩综合在线| 本田岬高潮一区二区三区| 日韩精品欧美精品| 亚洲免费视频中文字幕| 久久综合国产精品| 欧美日韩一区视频| 波多野结衣在线一区| 蜜臀精品久久久久久蜜臀| 一区二区在线免费观看| 久久精品综合网| 欧美一区二区三区四区视频| 色婷婷av一区二区三区软件| 韩国女主播一区二区三区| 亚洲五码中文字幕| 1024成人网色www| 久久久综合精品| 日韩精品一区二区三区四区 | 国产精品美女久久久久久久久 | 亚洲日本青草视频在线怡红院| 精品久久久久香蕉网| 这里是久久伊人| 欧美午夜不卡视频| 91在线观看美女| 成人动漫av在线| 粉嫩aⅴ一区二区三区四区| 看电影不卡的网站| 日本不卡一二三区黄网| 亚洲不卡一区二区三区| 夜夜亚洲天天久久| 亚洲欧洲综合另类| 综合亚洲深深色噜噜狠狠网站| 欧美激情一区二区三区四区| 精品成人一区二区三区四区| 91精品国产综合久久久蜜臀图片 | 亚洲欧洲国产日本综合| 国产亚洲综合在线| 337p粉嫩大胆色噜噜噜噜亚洲 | 最新热久久免费视频| 日本一区二区成人| 国产欧美日本一区视频| 国产色产综合产在线视频| 国产性色一区二区| 久久久久国产免费免费|