So easy Webservice 1.Socket建设web服务
socket 是用來進行網絡通訊的,簡單來說,遠程機器和本地機器各建一個socket,然后通過該socket進行連接通訊
socket簡單模型圖:
socket的原理圖:
?
代碼實現:
1.創建socket服務端:用于處理客戶端發送的請求數據
新建socket_server項目,添加SocketServer.java,然后run main方法,服務端處于等待客戶端狀態。
public class SocketServer {/*** 服務器端口*/private static int port = 9999;public static void main(String[] args) {try {//1.創建ServerSocket對象,用于讓客戶端連接ServerSocket serverSocket = new ServerSocket(port);//2.線程等待,直到收到客戶端請求,進行處理while(true){System.out.println("等待客戶端請求---");Socket socket = serverSocket.accept();//收到客戶端請求//3.獲取輸入流對象InputStream,用于獲取客戶端發送的數據InputStream in = socket.getInputStream();byte[] b = new byte[1024];in.read(b);String req = new String(b, 0, b.length);//從0-lengthSystem.out.println("獲取客戶端數據success,reqData = "+req);//4.獲取輸出流對象OutputStream,用于給客戶端返回數據OutputStream out = socket.getOutputStream();//轉大寫后,返回給客戶端 out.write(req.toUpperCase().getBytes());//5.結束通信,關閉socket,關閉流 in.close();out.close();socket.close();}} catch (UnknownHostException e) {System.out.println("---找不到服務器的端口---");e.printStackTrace();} catch (IOException e) {System.out.println("---通信錯誤---");e.printStackTrace();}} }2.創建客戶端
新建一個socket_client項目,添加SocketClient.java
public class SocketClient {/*** 服務器ip地址*/private static String host = "127.0.0.1";/*** 服務器端口*/private static int port = 9999;public static void main(String[] args) {try {//1.創建socket對象,用于向服務端發送請求Socket socket = new Socket(host, port);//2.獲取輸出流對象OutputStream,用于給服務端輸出數據OutputStream out = socket.getOutputStream();//輸入字符串System.out.println("請輸入字符串:");Scanner input = new Scanner(System.in);String reqStr = input.next();//輸出到服務器 out.write(reqStr.getBytes());//3.獲取輸入流對象InputStream,用于輸入服務端返回處理后的數據InputStream in = socket.getInputStream();//獲取服務端返回的數據byte[] b = new byte[1024];in.read(b);//將字節輸入到b中String respStr = new String(b, 0, b.length);System.out.println("服務端處理后的結果:"+respStr);//4.關閉socket,關閉流,結束通信 in.close();out.close();socket.close();} catch (UnknownHostException e) {System.out.println("---找不到服務器的端口---");e.printStackTrace();} catch (IOException e) {System.out.println("---通信錯誤---");e.printStackTrace();}} }3.啟動客戶端:
客戶端 控制臺:請輸入字符串:hello(輸入后回車)服務端處理后的結果:HELLo-------------------------------------------- 服務端 控制臺:等待客戶端請求---獲取客戶端數據success,reqData = hello?
測試:
1.通過C#客戶端來訪問Java的Socket服務
?
2.通過IE來訪問SocketService
accept success....... 從客戶端傳送來的數據如下: POST / HTTP/1.1 Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: 127.0.0.1:9999
?Content-Length:?10
Connection:?Keep-Alive
Cache-Control:?no-cache
word=hello
??
測試結果:
1.1: 不同的語言支持Socket通信嗎? 支持(經測試,上面的socketserver端程序,使用c#,web瀏覽器也可以訪問)
1.2: 不同的協議支持Socket通信嗎? web程序可以調用socket請求,但是由于協議不同,因此在處理的時候要過濾http的協議格式,返回的時候還需要添加 http返回的格式
1.3: 如果參數多: 可維護性就比較低
1.4: Socket服務有利于推廣嗎? 不利
總結:
* 服務端流程:
* 1.創建ServerSocket對象,用于讓客戶端連接
* 2.獲取socket對象,線程等待,直到收到客戶端請求
* 3.獲取輸入流對象InputStream,用于獲取客戶端發送的數據
* 4.獲取輸出流對象OutputStream,用于給客戶端返回數據
* 5.結束通信,關閉socket,關閉流
*
* socket和webservice比較,缺點:
* 1.Socket服務不利于推廣(如果讓別人知道你的Socket服務)
* 2.Socket處于傳輸層, 有可能無法穿越防火墻
* 3.Socket本身處于傳輸層,要處理應用層的服務要解析HTTP協議比較麻煩,但是現在我們的應用都是基于web的, web中的數據傳輸就需要HTTP協議
* 4.即使定義了格式. 后面如果格式改變則客戶端格式都需要同步變化維護困難
?
/**
* 客戶端流程:
* 1.創建socket對象,用于向服務端發送請求
* 2.獲取輸出流對象OutputStream,用于給服務端輸出數據
* 3.獲取輸入流對象InputStream,用于接受服務端返回處理后的數據
* 4.結束通信,關閉socket,關閉流
* @author mlxs
*
*/
?
轉載于:https://www.cnblogs.com/yangzhenlong/p/5163293.html
總結
以上是生活随笔為你收集整理的So easy Webservice 1.Socket建设web服务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 治疗输卵管堵了去哪里医院
- 下一篇: MyEclipse 6.5安装maven