1. 程式人生 > >Android 開發即時聊天工具 YQ :(一) Socket 初步

Android 開發即時聊天工具 YQ :(一) Socket 初步

這段時間在學習Android網路程式設計,習慣一邊寫個簡單的專案一邊學習,所以就有了這個簡易的簡易的,,,專案,

類似於手機QQ等等的即時聊天工具,當然功能及其簡單,跟那些沒法比,只是學習,實現簡單功能就OK,

聽說QQ是有自己的協議的,貌似挺複雜,,,

只為學習交流之用,而且本人也是Android小菜鳥一枚,錯誤不足在所難免,請大家多多指正,3Q~

先看看socket通訊基礎:

所謂socket通常也稱作"套接字",用於描述IP地址和埠,是一個通訊鏈的控制代碼。應用程式通常通過"套接字"向網路發出請求或者應答網路請求。 

Socket和ServerSocket類庫位於java.net包中。ServerSocket用於伺服器端,Socket是建立網路連線時使用的。在連線成功時,應用程式兩端都會產生一個Socket例項,操作這個例項,完成所需的會話。

伺服器:

使用ServerSocket監聽指定的埠,等待客戶連線請求,客戶連線後,會話產生;在完成會話後,關閉連線。 

客戶端:

使用Socket對網路上某一個伺服器的某一個埠發出連線請求,一旦連線成功,開啟會話;會話完成後,關閉Socket。

0~1023的埠號為系統所保留,例如http服務的埠號為80,telnet服務的埠號為21,ftp服務的埠號為23, 所以我們在選擇埠號時,最好選擇一個大於1023的數以防止發生衝突。

簡單的Client/Server示例:

伺服器:

public class Client {
	public static void main(String[] args) throws Exception {
		//向本機的5469埠發出客戶請求
		Socket socket=new Socket(InetAddress.getLocalHost(),5469);
		//由Socket物件得到輸入流,並構造相應的BufferedReader物件
		BufferedReader is=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		//由Socket物件得到輸出流,並構造PrintWriter物件
		PrintWriter os=new PrintWriter(socket.getOutputStream());
		//由系統標準輸入裝置構造BufferedReader物件
		BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
		while(true){
			String str=sin.readLine();//從系統標準輸入讀入一字串
			os.println(str);
			os.flush(); //重新整理輸出流,使Server馬上收到該字串
			
			String s=is.readLine();
			System.out.println("Server : "+s);//在標準輸出上列印從Server讀入的字串
			if(str.equals("end")){
				break;
			}
		}
		is.close();//關閉Socket輸入流
		os.close();//關閉Socket輸出流
		socket.close();//關閉Socket
	}
}

客戶端:
public class MyServer {
	public static void main(String[] args) throws Exception{
		ServerSocket server=new ServerSocket(5469);//建立一個ServerSocket在埠5469監聽客戶請求
		Socket client=server.accept();//使用accept()阻塞等待客戶請求
		BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));
		PrintWriter os=new PrintWriter(client.getOutputStream());
		BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
		while(true){
			String str=is.readLine();
			System.out.println("Client : "+str);//在標準輸出上列印從Client讀入的字串
			
			os.println(sin.readLine());
			os.flush();//重新整理輸出流,使Client馬上收到該字串
			if(str.equals("end")){
				break;
			}
		}
		is.close();
		os.close();
		client.close();
		server.close();
	}
}

回話示例圖:


上邊的程式碼只是實現一個客戶端訪問伺服器,如果要多個客戶同時訪問一個伺服器,那麼服務端的程式碼就要修改了:

public class MyServer extends Thread{
	Socket client;
	public MyServer(Socket c){
		this.client=c;
	}
	public void run() {
		try{
			BufferedReader is=new BufferedReader(new InputStreamReader(client.getInputStream()));
			PrintWriter os=new PrintWriter(client.getOutputStream());
			BufferedReader sin=new BufferedReader(new InputStreamReader(System.in));
			while(true){
				String s=is.readLine();
				System.out.println("Client : "+s);//在標準輸出上列印從Client讀入的字串
				
				String str=sin.readLine();//從系統標準輸入讀入一字串
				os.println(str);
				os.flush();//重新整理輸出流,使Client馬上收到該字串
				if(str.equals("end")){
					break;
				}
			}
			is.close();
			os.close();
			client.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception{
		ServerSocket server=new ServerSocket(5469);//建立一個ServerSocket在埠5469監聽客戶請求
		while(true){
			MyServer s=new MyServer(server.accept());//使用accept()阻塞等待客戶請求
			s.start();
		}
	}
}

謝謝大家支援!歡迎一起學習交流!