多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > Java小程序之簡單多人聊天室的實(shí)現(xiàn)(山寨QQ前傳)

Java小程序之簡單多人聊天室的實(shí)現(xiàn)(山寨QQ前傳)

來源:程序員人生   發(fā)布時(shí)間:2017-03-10 10:13:19 閱讀次數(shù):4754次

Java小程序之簡單多人聊天室的實(shí)現(xiàn)(山寨QQ前傳)

1、前言:
通過對Java服務(wù)器生猛上手的學(xué)習(xí),已基本明白了Java中通訊的基本原理,和服務(wù)器,ip,ip地址的概念;
我們思考下服務(wù)器究竟是用來干嗎的呢?當(dāng)多臺客戶端連上服務(wù)器以后,服務(wù)器需要提供的就是為連接進(jìn)來的客戶端提供相應(yīng)的服務(wù);具體的來講就是處理不同客戶端發(fā)來的消息或數(shù)據(jù),然后把這些消息或數(shù)據(jù)發(fā)送到另外的客戶端;服務(wù)器的目的就是正確轉(zhuǎn)發(fā)消息或數(shù)據(jù);

2、簡單多人聊天室的實(shí)現(xiàn)思路:
1、創(chuàng)建服務(wù)器等待客戶真?zhèn)€連接
2、客戶端連接進(jìn)來以后,獲得輸入輸出流,利用輸入輸出流發(fā)送消息;
3、發(fā)送服務(wù)器連接成功的信息給客戶端,并提示客戶端輸入賬戶和密碼進(jìn)行登錄
4、服務(wù)器接收客戶端發(fā)來的賬號和密碼,校驗(yàn)成功后,提示登錄成功,開始多人聊天

難點(diǎn):如何實(shí)現(xiàn)多人聊天?定義1個(gè)容器:用于封裝所有的ServerThread線程對象,遍歷該容器中的對象,將消息轉(zhuǎn)發(fā)給每個(gè)客戶端(自己可以除外)

問題:當(dāng)某個(gè)客戶端退出后,其他客戶端再發(fā)消息的時(shí)候,轉(zhuǎn)發(fā)就會報(bào)錯(cuò);

解決:當(dāng)有客戶端退出時(shí),將該客戶端從容器中移除;不在向該客戶端轉(zhuǎn)發(fā)消息;

3、程序源代碼:

連接服務(wù)器類:
package com.huaxin.server;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Myserver {
	
	public static ArrayList<ServerThread>list =new ArrayList<ServerThread>();
	
	public  void initServer() {
		
		try {
			//創(chuàng)建服務(wù)器對象,并指定端口號
			ServerSocket server = new ServerSocket(9090);
			System.out.println("服務(wù)器已建立......");
			//不斷獲得客戶真?zhèn)€連接
			while(true){
				Socket socket =server.accept();
				System.out.println("客戶端連接進(jìn)來了......");
				//當(dāng)有客戶端連接進(jìn)來以后,開啟1個(gè)線程,用來處理該客戶真?zhèn)€邏輯,
				ServerThread st = new ServerThread(socket);
				st.start();
				//添加該客戶端到容器中
				list.add(st);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}


服務(wù)器線程處理類:
package com.huaxin.server;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ServerThread extends Thread {

	public Socket socket;
	public InputStream ins;
	public OutputStream ous;

	public ServerThread(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			// 獲得輸入輸出流
			ins = socket.getInputStream();
			ous = socket.getOutputStream();
			// 發(fā)送消息給客戶端
			String msg = "welcome to zhou's server !";
			sendMsg(ous, msg);
			// 發(fā)送要求登錄信息給客戶端
			String userinfo = "please input your name:";
			sendMsg(ous, userinfo);
			// 獲得客戶端輸入的用戶名
			String userName = readMsg(ins);
			// 發(fā)送要求密碼信息給客戶端
			String pwd = "please input your password:";
			sendMsg(ous,  pwd);
			// 獲得客戶端輸入的密碼
			String pass = readMsg(ins);
			// 登錄驗(yàn)證
			boolean falg = loginCheck(userName, pass);
			// 校驗(yàn)不通過時(shí),循環(huán)校驗(yàn)
			while (!falg) {
				msg = "Fail to connect server......";
				sendMsg(ous, msg);
				msg = "please check your name and password and login again.....";
				sendMsg(ous, msg);
				msg = "please input your name:";
				sendMsg(ous, msg);
				// 獲得客戶端輸入的用戶名
				userName = readMsg(ins);
				// 發(fā)送要求密碼信息給客戶端
				msg = "please input your password:";
				sendMsg(ous, msg);
				// 獲得客戶端輸入的密碼
				pass = readMsg(ins);
				falg = loginCheck(userName, pass);
			}

			// 校驗(yàn)成功后:開始聊天
			msg = "successful connected..... you can chat with your friends now ......";
			sendMsg(ous, msg);
			// 聊天處理邏輯
			//讀取客戶端發(fā)來的消息
			msg=readMsg(ins);
			//輸入bye結(jié)束聊天
			while(!"bye".equals(msg)){
				//給容器中的每一個(gè)對象轉(zhuǎn)發(fā)消息
				for (int i = 0; i <Myserver.list.size(); i++) {
					ServerThread st =Myserver.list.get(i);
					//不該自己轉(zhuǎn)發(fā)消息
					if(st!=this){
						sendMsg(st.ous, userName+"  is say:"+msg);
					}
				}
				//等待讀取下1次的消息
				msg=readMsg(ins);
			}

		} catch (Exception e) {
			System.out.println("客戶端不正常關(guān)閉......");
//			e.printStackTrace();
		}
		//有異常后統(tǒng)1將流關(guān)閉
		try {
			ins.close();
			ous.close();
			socket.close();
			//將當(dāng)前已關(guān)閉的客戶端從容器中移除
			Myserver.list.remove(this);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 校驗(yàn)客戶端輸入的賬號和密碼的函數(shù),由于沒有數(shù)據(jù)庫,暫時(shí)寫死了
	public boolean loginCheck(String name, String pwd) {
		if (name.equals("zhou") && pwd.equals("zhou") || name.equals("user") && pwd.equals("pwd")
				|| name.equals("huaxinjiaoyu") && pwd.equals("huaxinjiaoyu")) {

			return true;
		}
		return false;
	}

	// 發(fā)送消息的函數(shù)
	public void sendMsg(OutputStream os, String s) throws IOException {
		// 向客戶端輸出信息
		byte[] bytes = s.getBytes();
		os.write(bytes);
		os.write(13);
		os.write(10);
		os.flush();

	}

	// 讀取客戶端輸入數(shù)據(jù)的函數(shù)
	public String readMsg(InputStream ins) throws Exception {
		// 讀取客戶真?zhèn)€信息
		int value = ins.read();
		// 讀取整行 讀取到回車(13)換行(10)時(shí)停止讀
		String str = "";
		while (value != 10) {
			// 點(diǎn)擊關(guān)閉客戶端時(shí)會返回⑴值
			if (value == ⑴) {
				throw new Exception();
			}
			str = str + ((char) value);
			value = ins.read();
		}
		str = str.trim();
		return str;
	}

}


函數(shù)入口類:
package com.huaxin.server;

public class Test {
	
	public static void main(String[] args) {
		Myserver ms = new Myserver();
		ms.initServer();
	}

}


4、運(yùn)行結(jié)果:(務(wù)必先啟動服務(wù)器

第1次毛病是由于未先開啟服務(wù)器

輸入正確的用戶名和密碼進(jìn)行登錄:

多人聊天界面:(中間有1次密碼輸入毛病,但是還是可以再次輸入.......)


5、總結(jié):
通過完成這個(gè)簡單的多人聊天的小程序,有1種說不出來的喜悅感;原來用Java來實(shí)現(xiàn)簡單的多人聊天這么簡單;自己也能寫出1個(gè)小小的聊天的軟件了呢......
接下來我們是否是可以寫個(gè)山寨版的QQ了呢......哈哈........拭目以待.......
共勉!


生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日本免费一区二区视频 | 欧美日韩精品乱国产 | 亚洲精品在线第一页 | jizz日本护士视频 | jizzjizz黄大片| 亚洲天码中文字幕第一页 | 爆操网站 | 图片区另类小说 | 欧美天堂在线视频 | 欧美jizzjizz在线播放 | 动漫美女口工h福利动画网站 | 国产高清乱码无卡女大生 | fxxxx性欧美高清 | 色婷婷久久综合中文久久蜜桃 | 欧美高清免费精品国产自 | 91成人午夜精品福利院在线观看 | 精品一区二区三区四区在线 | 波多野结衣国产一区 | 久久精品一区二区影院 | 91精品欧美综合在线观看 | 亚州天堂网 | 欧美性猛片xxxxⅹ免费 | 国产欧美一区二区精品久久久 | 一级一级 a爱片免费视频 | 一区二区在线精品免费视频 | 玖玖精品在线观看 | 三级小视频在线观看 | 国产国产人免费视频成69大陆 | 日韩特黄特色大片免费视频 | 免费性生活视频 | 日本大臿亚洲香蕉大片 | 精品精品国产高清a毛片牛牛 | 最新欧美一级视频 | 在线高清观看 | 国产三级视频 | 亚洲色欧美 | xx国产| 国产视频一区在线 | 国产精品麻豆高清在线观看 | 亚洲 欧美 小说 国产 图片 | 免费欧美在线视频 |