系統運維繫列 之網路程式設計/資料採集/互動方式彙總
技術標籤:基礎運維linuxhttpsocketjava網路
本篇部落格意在總結一下資料採集/互動的方式,直白點說就是介面/通訊的問題,即怎樣建立和對端的通訊連線,資料怎樣傳送,採用什麼方式入庫等。我們的世界就是一個萬物互聯的世界,本質上講日常生活中我們都在做資訊互動,像古代戰爭時候的烽火臺,到近現代戰爭的電報/電話,再到現在的網際網路/資訊化,資訊的互動非常重要。
網路程式設計的三要素:
IP地址:每個裝置在網路中的唯一標識,本地迴路地址127.0.0.1,廣播地址255.255.255.255,IPV4 4個0-255,IPV6 共8組,每組4個16進位制;
埠號:每個程式在裝置上的唯一標識,每個網路程式都需要繫結一個埠號,傳輸資料時除了明確發到哪臺機器還要明確發到哪個程式;
part1:socket介面
socket是在應用層和傳輸層之間的一個抽象層,它把TCP/IP層複雜的操作抽象為幾個簡單的介面供應用層呼叫已實現程序在網路中通訊。網路上具有唯一標識的IP地址和埠號組合在一起才能構成唯一能識別的socket識別符號套接字。在java中比較重要的兩個類有socket類和ServerSocket類,前者是java.net.Socket類,一般用於客戶端程式碼的編寫;後者是java.net.ServerSocket類,一般用於服務端程式碼的編寫,ServerSocket與Socket不同,ServerSocket是等待客戶端的請求,一旦獲得一個連線請求,就建立一個Socket示例來與客戶端進行通訊。 當然,這裡的客戶端和服務端也是一個相對的概念,客戶端和服務端都可以相互讀寫對方的資料,一般來講就是服務端是資料來源,客戶端去服務端取資料或者服務端將資料推送給客戶端,這裡重點講的場景
步驟1:測試一下服務端和客戶端路由埠是否開通,並且要在服務端開啟埠並確保此埠未佔用。
telnet ip地址 埠號 檢視埠是否開通,Windows下測試如果開通會出現黑框,沒有任何提示資訊,這時退出:CTRL+] 之後輸入quit;
lsof -i:A 檢視A埠有沒有被佔用;
如果埠未開通,在linux伺服器下使用firewall或者iptables開啟,具體可以參考連結資料。
補充:埠號的範圍從0到65535,但是數字較小的埠一般已經預設佔用,比如:
ftp(21) SSH(22) smtp(25) web(80) oracle(1521)
mysql(3306) QQ(4000) tomcat(8080)
public void server() {
ServerSocket serverSocket = null;
Socket client = null;
OutputStream dos = null; //輸出流
InputStream dis = null; //輸入流
try{
serverSocket = new ServerSocket(port);
System.out.println("Server is starting...\n");
client = serverSocket.accept();
dis = client.getInputStream();
BufferedReader inReader = new BufferedReader(new InputStreamReader(dis,"GB2312"));
StringBuffer sBuffer = new StringBuffer();
while(true) {
String line = inReader.readLine();
System.out.println("客戶端發過來的內容:" + line);
}
}
}
part2:http介面
HTTP(HyperText Transfer Protocol)是一套計算機通過網路進行通訊的規則。HTTP協議採用了請求/響應模型,客戶端向伺服器傳送一個請求報文,請求報文包含請求的方法、URL、請求頭部和請求資料等。伺服器以一個狀態行作為響應,響應的內容包括協議版本、狀態程式碼、伺服器資訊、響應頭部和響應資料。
步驟1:同tomcat步驟,需要保證路由狀態和埠空閒。
步驟2:程式碼
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String ip = req.getRequestURI();
Map<String, String[]> map = req.getParameterMap();
StringBuffer inputString = new StringBuffer();
for (String key:map.keySet()) {
inputString.append(key);
inputString.append("=");
inputString.append(Arrays.toString(map.get(key)));
}
System.out.println(inputString.toString());
resp.setContentType("application/json;charset=utf-8");
resp.setCharacterEncoding("utf-8");
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String ip = req.getRequestURI();
InputStream dis = req.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(dis,"utf-8"));
String line = "";
StringBuffer inputString = new StringBuffer();
while ((line = reader.readLine())!=null) {
inputString.append(line);
}
JSONObject jsonObject = JSONObject.fromObject(inputString.toString());
System.out.println(jsonObject.toString());
resp.setContentType("application/json;charset=utf-8");
resp.setCharacterEncoding("utf-8");
}
part3:ftp檔案傳輸
FTP(File Transfer Protocol,檔案傳輸協議) 是 TCP/IP 協議組中的協議之一。FTP協議包括兩個組成部分,其一為FTP伺服器,其二為FTP客戶端。其中FTP伺服器用來儲存檔案,使用者可以使用FTP客戶端通過FTP協議訪問位於FTP伺服器上的資源。
程式碼見參考資料。
參考連結:
https://blog.csdn.net/qq_41517936/article/details/81015711 Socket和ServerSocket的簡單介紹及例子
https://blog.csdn.net/zx110503/article/details/78787483 CentOS7開啟埠(永久)
https://blog.csdn.net/qq_39946015/article/details/104374427?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.add_param_isCfhttp http請求與響應,客戶端與服務端介面開發
https://www.cnblogs.com/huzi007/p/4236150.html java實現ftp檔案的上傳與下載