今天開始又要複習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
// }
}
}
在命令行下的測試結果: