日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > Java小程序之簡單多人聊天室的實現(山寨QQ前傳)

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

來源:程序員人生   發布時間:2017-03-10 10:13:19 閱讀次數:4760次

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

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

2、簡單多人聊天室的實現思路:
1、創建服務器等待客戶真個連接
2、客戶端連接進來以后,獲得輸入輸出流,利用輸入輸出流發送消息;
3、發送服務器連接成功的信息給客戶端,并提示客戶端輸入賬戶和密碼進行登錄
4、服務器接收客戶端發來的賬號和密碼,校驗成功后,提示登錄成功,開始多人聊天

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

問題:當某個客戶端退出后,其他客戶端再發消息的時候,轉發就會報錯;

解決:當有客戶端退出時,將該客戶端從容器中移除;不在向該客戶端轉發消息;

3、程序源代碼:

連接服務器類:
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 {
			//創建服務器對象,并指定端口號
			ServerSocket server = new ServerSocket(9090);
			System.out.println("服務器已建立......");
			//不斷獲得客戶真個連接
			while(true){
				Socket socket =server.accept();
				System.out.println("客戶端連接進來了......");
				//當有客戶端連接進來以后,開啟1個線程,用來處理該客戶真個邏輯,
				ServerThread st = new ServerThread(socket);
				st.start();
				//添加該客戶端到容器中
				list.add(st);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

}


服務器線程處理類:
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();
			// 發送消息給客戶端
			String msg = "welcome to zhou's server !";
			sendMsg(ous, msg);
			// 發送要求登錄信息給客戶端
			String userinfo = "please input your name:";
			sendMsg(ous, userinfo);
			// 獲得客戶端輸入的用戶名
			String userName = readMsg(ins);
			// 發送要求密碼信息給客戶端
			String pwd = "please input your password:";
			sendMsg(ous,  pwd);
			// 獲得客戶端輸入的密碼
			String pass = readMsg(ins);
			// 登錄驗證
			boolean falg = loginCheck(userName, pass);
			// 校驗不通過時,循環校驗
			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);
				// 發送要求密碼信息給客戶端
				msg = "please input your password:";
				sendMsg(ous, msg);
				// 獲得客戶端輸入的密碼
				pass = readMsg(ins);
				falg = loginCheck(userName, pass);
			}

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

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

	// 校驗客戶端輸入的賬號和密碼的函數,由于沒有數據庫,暫時寫死了
	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;
	}

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

	}

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

}


函數入口類:
package com.huaxin.server;

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

}


4、運行結果:(務必先啟動服務器

第1次毛病是由于未先開啟服務器

輸入正確的用戶名和密碼進行登錄:

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


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


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产成人精品一区二区在线 | 成人国产精品 | 男女午夜视频 | 99麻豆| 国产精品久久久久久久午夜片 | 粉嫩欧美一区二区三区高清影视 | 日本三级网址 | 国产一二区在线 | 日本淫片 | 在线观看免费黄色 | 91成人在线播放 | 一区二区三区不卡视频在线观看 | 亚洲免费在线 | 欧美中文在线观看 | 国内精品视频在线 | 国产精品久久久久国产a级 中文字幕影院 | 亚洲女人天堂成人av在线 | 色中文字幕在线观看 | 国产精品黄 | 一级片在线播放 | 国产成人精品免费 | 欧美日韩国产色综合一二三四 | 五月婷婷在线播放 | a级特级毛片 | 国产精品视频网 | 国产精品久久久久久久久久尿 | 在线播放av网站 | 欧美天堂 | 免费国产一区 | 成人福利视频在线 | 麻豆视频一区二区 | 一区二区三区四区在线播放 | av久久久| 国产精品三级在线 | 欧美天堂在线观看 | 国产精品欧美一区二区 | 国产福利资源 | 成人av福利 | 国产精品99久久久久久久久 | 麻豆一区二区 | 自拍色图 |