So easy Webservice 1.Socket建设web服务
socket 是用來(lái)進(jìn)行網(wǎng)絡(luò)通訊的,簡(jiǎn)單來(lái)說(shuō),遠(yuǎn)程機(jī)器和本地機(jī)器各建一個(gè)socket,然后通過(guò)該socket進(jìn)行連接通訊
socket簡(jiǎn)單模型圖:
socket的原理圖:
?
代碼實(shí)現(xiàn):
1.創(chuàng)建socket服務(wù)端:用于處理客戶端發(fā)送的請(qǐng)求數(shù)據(jù)
新建socket_server項(xiàng)目,添加SocketServer.java,然后run main方法,服務(wù)端處于等待客戶端狀態(tài)。
public class SocketServer {/*** 服務(wù)器端口*/private static int port = 9999;public static void main(String[] args) {try {//1.創(chuàng)建ServerSocket對(duì)象,用于讓客戶端連接ServerSocket serverSocket = new ServerSocket(port);//2.線程等待,直到收到客戶端請(qǐng)求,進(jìn)行處理while(true){System.out.println("等待客戶端請(qǐng)求---");Socket socket = serverSocket.accept();//收到客戶端請(qǐng)求//3.獲取輸入流對(duì)象InputStream,用于獲取客戶端發(fā)送的數(shù)據(jù)InputStream in = socket.getInputStream();byte[] b = new byte[1024];in.read(b);String req = new String(b, 0, b.length);//從0-lengthSystem.out.println("獲取客戶端數(shù)據(jù)success,reqData = "+req);//4.獲取輸出流對(duì)象OutputStream,用于給客戶端返回?cái)?shù)據(jù)OutputStream out = socket.getOutputStream();//轉(zhuǎn)大寫(xiě)后,返回給客戶端 out.write(req.toUpperCase().getBytes());//5.結(jié)束通信,關(guān)閉socket,關(guān)閉流 in.close();out.close();socket.close();}} catch (UnknownHostException e) {System.out.println("---找不到服務(wù)器的端口---");e.printStackTrace();} catch (IOException e) {System.out.println("---通信錯(cuò)誤---");e.printStackTrace();}} }2.創(chuàng)建客戶端
新建一個(gè)socket_client項(xiàng)目,添加SocketClient.java
public class SocketClient {/*** 服務(wù)器ip地址*/private static String host = "127.0.0.1";/*** 服務(wù)器端口*/private static int port = 9999;public static void main(String[] args) {try {//1.創(chuàng)建socket對(duì)象,用于向服務(wù)端發(fā)送請(qǐng)求Socket socket = new Socket(host, port);//2.獲取輸出流對(duì)象OutputStream,用于給服務(wù)端輸出數(shù)據(jù)OutputStream out = socket.getOutputStream();//輸入字符串System.out.println("請(qǐng)輸入字符串:");Scanner input = new Scanner(System.in);String reqStr = input.next();//輸出到服務(wù)器 out.write(reqStr.getBytes());//3.獲取輸入流對(duì)象InputStream,用于輸入服務(wù)端返回處理后的數(shù)據(jù)InputStream in = socket.getInputStream();//獲取服務(wù)端返回的數(shù)據(jù)byte[] b = new byte[1024];in.read(b);//將字節(jié)輸入到b中String respStr = new String(b, 0, b.length);System.out.println("服務(wù)端處理后的結(jié)果:"+respStr);//4.關(guān)閉socket,關(guān)閉流,結(jié)束通信 in.close();out.close();socket.close();} catch (UnknownHostException e) {System.out.println("---找不到服務(wù)器的端口---");e.printStackTrace();} catch (IOException e) {System.out.println("---通信錯(cuò)誤---");e.printStackTrace();}} }3.啟動(dòng)客戶端:
客戶端 控制臺(tái):請(qǐng)輸入字符串:hello(輸入后回車)服務(wù)端處理后的結(jié)果:HELLo-------------------------------------------- 服務(wù)端 控制臺(tái):等待客戶端請(qǐng)求---獲取客戶端數(shù)據(jù)success,reqData = hello?
測(cè)試:
1.通過(guò)C#客戶端來(lái)訪問(wèn)Java的Socket服務(wù)
?
2.通過(guò)IE來(lái)訪問(wèn)SocketService
accept success....... 從客戶端傳送來(lái)的數(shù)據(jù)如下: 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
??
測(cè)試結(jié)果:
1.1: 不同的語(yǔ)言支持Socket通信嗎? 支持(經(jīng)測(cè)試,上面的socketserver端程序,使用c#,web瀏覽器也可以訪問(wèn))
1.2: 不同的協(xié)議支持Socket通信嗎? web程序可以調(diào)用socket請(qǐng)求,但是由于協(xié)議不同,因此在處理的時(shí)候要過(guò)濾http的協(xié)議格式,返回的時(shí)候還需要添加 http返回的格式
1.3: 如果參數(shù)多: 可維護(hù)性就比較低
1.4: Socket服務(wù)有利于推廣嗎? 不利
總結(jié):
* 服務(wù)端流程:
* 1.創(chuàng)建ServerSocket對(duì)象,用于讓客戶端連接
* 2.獲取socket對(duì)象,線程等待,直到收到客戶端請(qǐng)求
* 3.獲取輸入流對(duì)象InputStream,用于獲取客戶端發(fā)送的數(shù)據(jù)
* 4.獲取輸出流對(duì)象OutputStream,用于給客戶端返回?cái)?shù)據(jù)
* 5.結(jié)束通信,關(guān)閉socket,關(guān)閉流
*
* socket和webservice比較,缺點(diǎn):
* 1.Socket服務(wù)不利于推廣(如果讓別人知道你的Socket服務(wù))
* 2.Socket處于傳輸層, 有可能無(wú)法穿越防火墻
* 3.Socket本身處于傳輸層,要處理應(yīng)用層的服務(wù)要解析HTTP協(xié)議比較麻煩,但是現(xiàn)在我們的應(yīng)用都是基于web的, web中的數(shù)據(jù)傳輸就需要HTTP協(xié)議
* 4.即使定義了格式. 后面如果格式改變則客戶端格式都需要同步變化維護(hù)困難
?
/**
* 客戶端流程:
* 1.創(chuàng)建socket對(duì)象,用于向服務(wù)端發(fā)送請(qǐng)求
* 2.獲取輸出流對(duì)象OutputStream,用于給服務(wù)端輸出數(shù)據(jù)
* 3.獲取輸入流對(duì)象InputStream,用于接受服務(wù)端返回處理后的數(shù)據(jù)
* 4.結(jié)束通信,關(guān)閉socket,關(guān)閉流
* @author mlxs
*
*/
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangzhenlong/p/5163293.html
總結(jié)
以上是生活随笔為你收集整理的So easy Webservice 1.Socket建设web服务的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 治疗输卵管堵了去哪里医院
- 下一篇: MyEclipse 6.5安装maven