1. 程式人生 > >java實現qq聊天室功能

java實現qq聊天室功能

一下是伺服器端原始碼,供大家參考

下面是main.java

package com;

public class Main {

	public static void main(String args[]) {
		new ServerListener().start();
		
	}
}
下面是ServerListener,java
package com;

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

import javax.swing.JOptionPane;

public class ServerListener extends Thread {
	
	int count;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		System.out.println("監聽是否有客戶端連線");
		try {
			ServerSocket serverSocket = new ServerSocket(12345);
			while (true) {
				count++;
				Socket socket = serverSocket.accept();
				JOptionPane.showMessageDialog(null, "有客戶端連線當前伺服器");

				// 一旦有客戶端連線到伺服器,開一個獨立的執行緒
				ChatThread chat = new ChatThread(socket, count);
				chat.start();
				ManagerChatThread.getInstance().add(chat);

			}

		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}
}
下面是ChatThread.java
package com;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.Socket;

public class ChatThread extends Thread {

	int count;
	
	Socket socket;

	StringBuffer sb;

	public ChatThread(Socket socket, int count) {
		// TODO Auto-generated constructor stub
		this.socket = socket;
		this.count = count;
	}

	/**
	 * 向客戶端傳送訊息
	 * 
	 * @param msg
	 */
	public void out(String msg) {
		try {
			socket.getOutputStream().write((msg+"\n").getBytes("utf-8"));
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();

		// 讀客戶端的內容
		BufferedReader br = null;
		try {
			br = new BufferedReader(new InputStreamReader(
					socket.getInputStream(), "utf-8"));
			String line = null;
			while ((line = br.readLine()) != null) {
				System.out.println("客戶端說"+count+":" + line);
				// 向客戶端傳送資訊
				ManagerChatThread.getInstance().out(this, line);
			}
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		

	}
}

下面是ManagerChatThread.java
package com;

import java.util.ArrayList;

/**
 * @author Administrator 管理客戶端執行緒物件
 */
public class ManagerChatThread {
	private ArrayList<ChatThread> al = new ArrayList<ChatThread>();

	public static ManagerChatThread instance = new ManagerChatThread();

	private ManagerChatThread() {
	};

	public static ManagerChatThread getInstance() {
		return instance;
	}
	
	public void add(ChatThread chat){
		al.add(chat);
	}

	//向客戶端傳送資訊
	public void out(ChatThread chat, String line){
		for (int i = 0; i < al.size(); i++) {
			if(!al.get(i).equals(chat))
			{
				al.get(i).out(line);
			}
		}
	}
}
以上就是整個伺服器端的程式碼了,支援多個客戶端連線,伺服器端迴圈接收來自客戶端的請求

下滿貼上Android客戶端的程式碼

package com.exp.client;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.TextView;

public class Android_ClientActivity extends Activity implements OnClickListener {
	EditText et;
	TextView tv;
	Socket socket;

	BufferedWriter bw;
	BufferedReader br;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		findViewById(R.id.button1).setOnClickListener(this);
		findViewById(R.id.button2).setOnClickListener(this);

		tv = (TextView) findViewById(R.id.textView1);
		et = (EditText) findViewById(R.id.editText1);
		et.setText("");
		tv.setText("");
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.button1) {
			// TODO Auto-generated method stub
			new AsyncTask<String, String, Void>() {

				@Override
				protected Void doInBackground(String... params) {
					// TODO Auto-generated method stub
					try {
						socket = new Socket(params[0], 12345);

						bw = new BufferedWriter(new OutputStreamWriter(
								socket.getOutputStream(), "utf-8"));
						
						// 讀伺服器訊息
						br = new BufferedReader(new InputStreamReader(
								socket.getInputStream()));
						
						publishProgress("@sucess");
						String my = null;
						while ((my = br.readLine()) != null) {
							publishProgress(my);
						}

					} catch (UnknownHostException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					} catch (IOException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					return null;
				}

				@Override
				protected void onProgressUpdate(String... values) {
					// TODO Auto-generated method stub
					super.onProgressUpdate(values);
					if(values[0].equals("@sucess")){
						tv.append("ok\n");
						return;
					}
					tv.append("別人說:" + values[0]+"\n");
				}

			}.execute("10.0.2.2");
		} else if (v.getId() == R.id.button2) {
			// 將EidtText中的內容傳送給伺服器
			String msg = et.getText().toString() + "\n";
			try {
				bw.write(msg);
				bw.flush();

				tv.append("自己說:" + msg);
				et.setText("");
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

	}
}

簡單的佈局就不貼了,上面是android客戶端的實現比java更簡單,也可用純java來實現

下面貼上java客戶端的實現,以供大家參考

兩個不同包的Test類

package exp;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		
		try {
			Socket socket = new Socket("192.168.0.112", 6000);
			
			while(true){
				
				//阻塞方法,等待鍵盤輸入
				String value = scanner.next();
				
				OutputStream os = socket.getOutputStream();
				OutputStreamWriter osw = new OutputStreamWriter(os, "utf-8");
				BufferedWriter bw = new BufferedWriter(osw);
				bw.write(value+"\n");
				bw.flush();
			}
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	
	}

}

package com;

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

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		try {
			Socket socket = new Socket("192.168.0.112", 5000);
			
			//客戶端向伺服器傳送資料
			OutputStream os = socket.getOutputStream();
			String value = "abcabc";
			//字串轉化為位元組陣列
			byte c[] = value.getBytes();
			os.write(c);
			
			//客戶端接受伺服器資料
			InputStream is = socket.getInputStream();
			byte b[] = new byte[1024];
			int len = is.read(b);
			String s = new String(b, 0, len);
			System.out.println(s);
			
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}


以上有註釋以供大家參考,多學習,共勉

相關推薦

java實現qq聊天功能

一下是伺服器端原始碼,供大家參考 下面是main.javapackage com; public class Main { public static void main(String args[]) { new ServerListener().start();

用 Netty 實現 WebSocket 聊天功能

WebSocket 是 H5 的一種技術,目前有很多語言都有相應的實現,之前有用 WebSocket 實現過 Java 和安卓,IOS 通訊的專案。想來也該分享一下,看過不少專案要實現頁面資料實時更新的操作,有用輪詢有用 Socket 連結的,當然也不排除有很多前端其他技術可以實現,WebSocke

基於flask框架,使用websocket實現一對一聊天功能

info app lan 提示 function _id 數據 sca 響應 後端代碼: from flask import Flask,request,render_template from geventwebsocket.handler import WebSock

java基於redis訂閱/釋出訊息實現聊天功能

一、引言 趁著國慶節把redis高階應用都寫完吧,其實都很簡單。 redis高階應用:安全性、事務處理、持久化操作,訂閱/釋出、虛擬記憶體 安全性其實就是在連線redis時,需要一個密碼認證,可以

ajax實現聊天功能

需求如下: 先死後活。  需求分析,分析思路如圖所示: 1.建立資料庫 create database chat; create table messages( id int unsigned primary key auto_increment, sender va

Erlang聊天功能實現

作為新手的練習專案,使用erlang來實現一個聊天室是一個很好的練手形式,接下來講解下我開發過程的思路和根據需求變化的版本的迭代升級. 初代版本1.0 對於聊天室的需求有以下幾點: 1)使用者登入 2)所有登陸的使用者預設在大廳中,可以進行聊天 2)房間建立,建立者自動成為房主

基於flask框架,使用websocket實現多人聊天功能

後端程式碼:   # web_socket 的收發機制 # web_socket --> web + socket --> http協議 + socket # web_socket協議就是ws協議 # 基於flask框架為web_socket提供服務 from flas

網頁直播技術是如何實現的?以及如何實現簡單的聊天功能

一般很少創業型公司是全能型人才,一般都是做好自己精通的方向,把其他業務依託於其他成熟的第三方服務上。 前言:總而言之,實現web端的直播技術,可以採用呼叫第三方的服務,而我再一次 專案實踐中使用的

JAVA仿QQ聊天系統4.0(擴充套件韓順平的程式的功能及介面)附原始碼

 下載連結  http://download.csdn.net/detail/qq245034548/8391381連結:https://pan.baidu.com/s/1btDApLQuHvLk44EtWKQygw 密碼:3ezf4 詳細設計4.1 系統程式流程如下    

03_netty實現聊天功能

class ktr 連接 bind line 服務 RKE 客戶端 chatroom 【概述】 聊天室主要由兩塊組成:聊天服務器端(ChatRoomServer)和聊天客戶端(ChatClient)。 [ 聊天服務器(ChatRoomServer)功能概述 ] 1

HTML5 WebSocket(Client) + JavaWeb(Server) 實現簡單的聊天功能

介紹: WebSocket是HTML5規範新引入的功能,用於解決瀏覽器與後臺伺服器雙向通訊的問題,使用WebSocket技術,後臺可以隨時向前端推送訊息,以保證前後臺狀態統一,在傳

JAVA 實現 QQ 郵箱發送驗證碼功能(不局限於框架)

package -o lda tor apach return stack proc pub JAVA 實現 QQ 郵箱發送驗證碼功能(不局限於框架) 本來想實現 QQ 登錄,有域名一直沒用過,還得備案,好麻煩,只能過幾天再更新啦。 先把實現的發送郵箱驗證碼更能更新了。 老

黑科技!僅需 3 行程式碼,就能將 Gitter 整合到個人網站中,實現一個 IM 即時通訊聊天功能

歡迎關注個人微信公眾號: 小哈學Java, 優質文章第一時間推送!! 個人網站: https://www.exception.site/essay/how-to-use-gitter-on-your-website-quickly 一、前言 小哈從很早以前就有寫博文的習慣,不過那個時候,也沒咋認真地寫

Python實現文字聊天

跟著 tro 通過 客戶端 發送 cnblogs ima 命令 圖形 你是否想過用所學的Python開發一個圖形界面的聊天室程序啊? 像這樣的: 如果你想開發這樣一個有點懷舊風格的聊天程序,那麽可以接著看; 要開發這個聊天程序,你需要具備以下知識點: asyncore

11 TCP實現QQ聊天

odin 其他 close send 發送 rec lis socket raw_input 1.客戶端參考代碼 #coding=utf-8 from socket import * # 創建socket tcpClientSocket = socket(AF_IN

Python實現web聊天

支持 put all rem message one utf cti 訪問 使用Python模塊中的select模塊實現web聊天室功能select模塊Python中的select模塊專註於I/O多路復用,提供了select poll epoll三個方法(其中後兩個在L

實現簡易聊天(一)

ima log body .com 麻煩 導入 定義 右鍵 正常 預備工作: (1)讀取文件的時候可能會遇到多個文件一起傳,可以用線程池。 (2)發送不同類型的請求時,如發送的是聊天信息,發送的是文件,發送的是好友上線請求等,但對於接受者來說都是字節流無法分別,這就需要我們

Java實現網頁截屏功能(基於phantomJs)

ole ml2 red script phantom 功能 IV 測量 java代碼 公司最近有個需求:把用戶第一次的測量身體信息和最近一次測量信息進行對比,並且需要把對比的數據截成圖片可以發給用戶(需要在不打開網頁的情況下實時對網頁進行截圖然後保存到服務器上

java實現手機驗證碼功能

java實現給手機發送驗證碼,是需要平臺的支援的這裡我使用的是http://user.ihuyi.com/互億的簡訊服務 大家可以註冊一個賬號http://user.ihuyi.com/register.htmls這裡是比較簡單的實現大家可以根據自己的需求自行編寫 import org.a

PHP簡單實現WebSocket(聊天)

在PHP中,開發者需要考慮的東西比較多,從socket的連線、建立、繫結、監聽等都需要開發者自己去操作完成,對於初學者來說,難度方面也挺大的,所以本文的思路如下: 1、socket協議的簡介 2、介紹client與server之間的連線原理 3、PHP中建立socket的過程講解 4