日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在Socket做服务器,在手机上用Http访问

發(fā)布時(shí)間:2024/1/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Socket做服务器,在手机上用Http访问 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前幾天在本區(qū)看到一個(gè)貼子,有人問,在Socket做服務(wù)器,在手機(jī)上用Http訪問,如何實(shí)現(xiàn)。這個(gè)貼子,有十來個(gè)人回復(fù)了,可惜回復(fù)的都是:Socket使用TCP/IP協(xié)議,客戶端用HTTP協(xié)議,不同協(xié)議不可能實(shí)現(xiàn)通訊。再可惜,那個(gè)貼子結(jié)了,要不然,我就可以回復(fù)了!在這里拿出來說一下,讓大家不要再誤會了(TCP/IP與HTTP不可通訊)
因?yàn)槟壳昂芏嗍謾C(jī)仍不支持MIDP2.0,只支持MIDP1.0,而Socket技術(shù)只在MIDP2.0才提供支持,所以,一般的Java?ME程序的如果要實(shí)現(xiàn)C/S結(jié)構(gòu),都會選用Tomcat等服務(wù)器、sevlet或JavaBean等Java?EE架構(gòu)實(shí)現(xiàn)。不過,考慮到響應(yīng)速度與性能的問題,Tomcat等Java?EE架構(gòu)可能滿足不了業(yè)務(wù)要求,這樣,我們就要用到下面將要說的自已寫服務(wù)器的技術(shù)了。???
一般的C/S結(jié)構(gòu)程序,一般程序員都會寫,不過,這里一般程序員剛接觸Socket寫服務(wù)器,Http寫客戶端都會頭大——不可能吧,Socket用TCP/IP協(xié)議,客戶端用Http協(xié)議,不同協(xié)議間,怎么可能通訊呢!???
本文要說的就是這個(gè)問題了。???
大家一定都知道,網(wǎng)絡(luò)系統(tǒng)一共分7層,在這七層中,Http協(xié)議要高于TCP/IP協(xié)議(因?yàn)樵诨ヂ?lián)網(wǎng)中,計(jì)算機(jī)是通過IP定位的,也就是用TCP/IP協(xié)議了),對網(wǎng)絡(luò)操作系統(tǒng)有了解的人,一定不會忘記,我們用Http訪問www的時(shí)候,用的是域名,而域名,最終還是要通過DNS轉(zhuǎn)換成IP地址的。這就對了——HTTP協(xié)議基于TCP/IP協(xié)議!而Socket正是基于TCP/IP協(xié)議,這樣一來,它們就有了共同之外了!有了以上的認(rèn)識,理論方面就沒問題了。???
我們再討論一下實(shí)現(xiàn):???
服務(wù)器:???
和一般的C/S結(jié)構(gòu)一樣,用Socket(java中用ServerSocket)監(jiān)聽。監(jiān)聽、讀寫消息的方面與一般的C/S服務(wù)器一模一樣。不同的是,考慮到客戶端只支持http協(xié)議,所以,讀客戶端消息的時(shí)候,讀到的將是http頭+消息,那么,我們便要用程序分析并去掉http頭,只用消息。發(fā)消息的時(shí)候正好相反,在發(fā)送的消息前面,自己加上http頭(其實(shí)就是一個(gè)包含一定內(nèi)容的字符串),這樣再發(fā)出去,客戶端就可以收到并讀取了。?
客戶端:???
用Http連接,在java中,用的是HttpConnection.open("http://"+IP+":"+Port)訪問服務(wù)器,這樣,就可以向ServerSocket請求連接了。???
在open之后,再向HttpConnection對象的輸出流寫入消息,然后刷新流再關(guān)閉HttpConnection就可以了,客戶端因?yàn)楸緛碛玫木褪莌ttp協(xié)議,所以不用自行加http頭,底層會處理的;服務(wù)器在Accept()之后,就可以從Socket的輸入流讀到消息了。當(dāng)然,如果要讀服務(wù)器的消息的話,可以在HttpConnection關(guān)閉前讀它的輸入流(讀的時(shí)候,如果還沒有收到服務(wù)器消息,會阻塞當(dāng)前線程的,直到讀到為止,不怕讀不到)。客戶端讀到的消息,是不包括http頭的,所以,也就不用我們自行處理了。?
要注意的是,HttpConnetion.open后,只能用一次,刷新后,它就無效了,得重新調(diào)用open方法再次建立連接。(服務(wù)器最好使用線程建立Socket與客戶端連接,連接一次一個(gè)線程。)???
現(xiàn)在在家里,未例的代碼放在公司了,明天如果記得的話,回公司上傳個(gè)示例代碼給大家借鑒。

服務(wù)器示例代碼:(共三個(gè)類)

//HttpServer.javapackage testnetserver;public class HttpServer{public HttpServer() {}public static void main(String[] aregs){HttpServerSocket hss=new HttpServerSocket();hss.start();}}//HttpServerSocket.javapackage testnetserver;import java.net.ServerSocket;import java.io.*;public class HttpServerSocket extends Thread{ServerSocket ss=null;private static final int port=2222;public HttpServerSocket() {}public void run(){try {ss = new ServerSocket(port);}catch (IOException ex) {System.out.println("ServerSocket can not listen");System.out.println("Error on ServerSocket bind port");ex.printStackTrace();ss=null;return;}//循環(huán)監(jiān)聽 while(true){HttpSocket hs=null;try {hs=new HttpSocket();hs.s=ss.accept();System.out.println("have a client connect");hs.start();}catch (IOException ex1) {System.out.println("Error on accept");}}}}//HttpSocket.javapackage testnetserver;import java.net.Socket;import java.io.*;public class HttpSocketextends Thread {public Socket s = null;String msg = "";public HttpSocket() {}public void run() {BufferedReader is = null;PrintWriter os = null;try {//由Socket對象得到輸入流,并構(gòu)造相應(yīng)的BufferedReader對象 is = new BufferedReader(new InputStreamReader(s.getInputStream()));//由Socket對象得到輸出流,并構(gòu)造PrintWriter對象 os = new PrintWriter(s.getOutputStream());}catch (IOException ex) {System.out.println("Error on get Buffere");}String temp = "";try {temp = is.readLine();while (temp != null) {msg += temp;if (temp.length() > 4 &&temp.substring(temp.length() - 4).equals("/End")) {temp = is.readLine(); //虛讀 temp = null;break;}msg += "\r\n";temp = is.readLine();}getMsg();//立刻回發(fā)消息 msg = "Begin/" + msg + "/End";os.write("HTTP/1.1 200 OK\r\n");os.write("Content-Type: text; charset=utf\r\n");os.write( ("Content-Length: " + msg.length() + "\r\n"));os.write("\r\n");os.write(msg);os.flush();msg = "";}catch (IOException ex1) {System.out.println("Error on read or write Buffered");ex1.printStackTrace();}try {sleep(100);}catch (InterruptedException ex2) {System.out.println("Error on HttpSocket sleep");}}//去掉協(xié)議頭,取出純消息 private void getMsg() {int begin = msg.indexOf("Begin/");int end = msg.indexOf("/End");if (begin >= 0 && end > 0 && msg.length()>"Begin/".length()) {msg = msg.substring(begin + "Begin/".length(), end);System.out.println(msg);}else {msg = "";}}}


客戶端示例代碼(主要部份):

public void run() {HttpConnection conn = null;DataInputStream dis = null;DataOutputStream dos = null;int begin = 0, end = 0;byte temp[] = new byte[10000];int len = 0;try {conn = (HttpConnection) Connector.open("http://" + IP + ":" +port);//寫輸出流(向服務(wù)器發(fā)送信息) dos = conn.openDataOutputStream();msg = "Begin/" + msg+"/End";//dos.writeUTF(msg);dos.write(msg.getBytes());dos.flush();dos.close();if (!isTestConnectTime) {dataLenght = msg.length();}backTime = 0;//讀輸入流(讀服務(wù)器消息) dis = conn.openDataInputStream();len = dis.read(temp);if (len > 0) {receiveMsg = "";for (int i = 0; i < len; i++) {receiveMsg += (char) temp[i];}}if (receiveMsg.length() > 0) {begin = receiveMsg.indexOf("Begin/");end = receiveMsg.indexOf("/End");if (begin >= 0 && end > 0) {receiveMsg = receiveMsg.substring(begin +"Begin/".length(), end);if (receiveMsg != null && receiveMsg.trim() != "" &&receiveMsg.length() > 0) {System.out.println(receiveMsg);testCount++;if (!isTestConnectTime) {allDataLenght += dataLenght;}}}}//dos.close();dis.close();conn.close();}catch (Exception ex1) {System.out.println("Error on send message");ex1.printStackTrace();}}


記憶不是很好,找了很久,才找到我在第一個(gè)貼子第一句話說的貼子:
http://community.csdn.net/Expert/topic/4941/4941245.xml?temp=5.889529E-02

回樓上:
呵呵,也許真的是我太沒見識了呢!為此,我還真的回去翻了書:
TCP/IP:(傳輸控制協(xié)議/網(wǎng)間協(xié)議)Internet?的主要協(xié)議之一,按功能分層的話,相對于ISO模型中的網(wǎng)絡(luò)層、傳輸層。TCP/IP包含網(wǎng)絡(luò)層的IP協(xié)議與傳輸層的TCP等協(xié)議,它有自己的參考模型——TCP/IP網(wǎng)絡(luò)參考模型:應(yīng)用層,傳輸層,網(wǎng)絡(luò)層,鏈路層。TCP協(xié)議是TCP/IP網(wǎng)絡(luò)中最常用的協(xié)議,位于傳輸層(UDP協(xié)議亦是如此)!
綜上所述:TCP/IP是一套協(xié)議,也是一個(gè)參考模型!與本貼并無矛盾!
Socket:也就是常說的套接字了,網(wǎng)絡(luò)上運(yùn)行的程序之間雙向通信鏈路的最終結(jié)點(diǎn),是TCP/UDP的基礎(chǔ)。
HTTP協(xié)議:Internet的主要協(xié)議之一:位于應(yīng)用層。(比TCP所在的傳輸層高)。如果分析過Http通訊的人一定清楚,http協(xié)議不過是封裝了TCP協(xié)議而已。

總結(jié)

以上是生活随笔為你收集整理的在Socket做服务器,在手机上用Http访问的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。