java Socket編程基礎

                今天開始又要複習java基礎部分的知識了,我最薄弱的就是網絡編程,線程,io這幾塊,趁平時放假好好把這幾部分的基礎知識補上,爲下一輪面試做好準備。今天從Socket入門開始,做了一個小的P2P 的Demo ,其實網絡編程也並不是很難,懂一些協議的原理利用java就可以實現兩臺電腦之間的點對點通信。基本原理就兩句話:作爲服務器端, ServerSocket 在初始化的時候會不斷的去監聽客戶端的請求,當服務器端接受的客戶端Socket的請求的時候,服務器端也會產生一個Socket和客戶端對應完成通信的功能;作爲客戶端,一旦指定Socket 的IP和端口,便可以向服務器對應的端口發送連接請求;由此便可以輕鬆的實現點對點的通信。缺點就是,只能交互式的你一言我一語,不能完成併發的功能,希望這個回合的複習結束時我能把多線程加上。

Server代碼:

package edu.hue.jk.socket;

import java.io.BufferedReader;

/***
 * 
 * @author dell
 *作爲服務器端, ServerSocket 在初始化的時候會不斷的去監聽客戶端的請求
 *當服務器端接受的客戶端Socket的請求的時候,服務器端也會產生一個Socket和客戶端對應完成通信的功能
 */
public class Server {
	public static void main(String[] args)throws Exception {
		 ServerSocket server=new ServerSocket(30000);   //  創建一個ServerSocket用於監聽服務器端的請求
		 while(true){    // 服務器端不斷的監聽客戶端的請求
			Socket serverSocket=server.accept();  // 當監聽客戶端的請求時,服務器端也會產生一個對應的Socket 來處理和客戶端之間的通信
			PrintStream ps=new PrintStream(serverSocket.getOutputStream());// 得到服務器端Socket的輸出流,用來向客戶端發送信息
			ps.println("您好,服務器已經連接成功");
			ps.flush();
			System.out.println("服務器連接成功");
			InputStream in=serverSocket.getInputStream();  // 得到服務器Socket的輸入流,用來讀取客戶端的內容
			BufferedReader read=new BufferedReader(new InputStreamReader(in)); // 將輸入流進行包裝
			String msg=null;
			while(true)    // 當客戶端有信息發送過來的時候,服務器端接受一條數據,並向客戶端回覆
			{ 
				msg=read.readLine();
				System.out.println("來自客戶端的信息:"+msg);
				System.out.println("請輸入信息:");
				BufferedReader readFromkey=new BufferedReader(new InputStreamReader(System.in)); // 用來從鍵盤中獲取信息
				msg=readFromkey.readLine();  // 從鍵盤中得到信息
				ps.println(msg);
				ps.flush();
			}
//			 ps.close(); //  關閉打印流       應該try  catch finally 這裏直接做了異常拋出處理
//			 serverSocket.close();  // 關閉服務器端socket
			 
		 }
	}

}

Client 代碼:

package edu.hue.jk.socket;

import java.io.BufferedReader;

public class Client {
	/**
	 * @param args
	 * 作爲客戶端,一旦指定Socket 的IP和端口,便可以向服務器對應的端口發送連接請求
	 */
	public static void main(String[] args) throws Exception{
		Socket client=new Socket("127.0.0.1",30000); // 向指定的服務器發送連接請求
		
		InputStream in=client.getInputStream();  // 得到客戶端Socket的輸入流,用來讀取服務器端的內容
		BufferedReader read=new BufferedReader(new InputStreamReader(in)); // 將輸入流進行包裝
		String msg=null;
		while(true){  // 只要服務器有信息反饋,客戶端就接受信息,並向服務端發送信息
			msg=read.readLine();
			System.out.println("來自服務器的信息:"+msg);
			System.out.println("請輸入信息:");
			PrintStream write=new PrintStream(client.getOutputStream()); // 包裝客戶端Socket 的輸出流用來向服務器端發送數據
			BufferedReader readFromkey=new BufferedReader(new InputStreamReader(System.in)); // 用來從鍵盤中獲取信息
			msg=readFromkey.readLine();  // 從鍵盤中得到信息
			write.println(msg);// 向服務器發送信息	
			write.flush();
		}
//		finally{
//			read.close();
//			client.close();s
//		}
	}
}

在命令行下的測試結果:

發佈了47 篇原創文章 · 獲贊 4 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章