在Socket做服务器,在手机上用Http访问
前幾天在本區看到一個貼子,有人問,在Socket做服務器,在手機上用Http訪問,如何實現。這個貼子,有十來個人回復了,可惜回復的都是:Socket使用TCP/IP協議,客戶端用HTTP協議,不同協議不可能實現通訊。再可惜,那個貼子結了,要不然,我就可以回復了!在這里拿出來說一下,讓大家不要再誤會了(TCP/IP與HTTP不可通訊)
因為目前很多手機仍不支持MIDP2.0,只支持MIDP1.0,而Socket技術只在MIDP2.0才提供支持,所以,一般的Java?ME程序的如果要實現C/S結構,都會選用Tomcat等服務器、sevlet或JavaBean等Java?EE架構實現。不過,考慮到響應速度與性能的問題,Tomcat等Java?EE架構可能滿足不了業務要求,這樣,我們就要用到下面將要說的自已寫服務器的技術了。???
一般的C/S結構程序,一般程序員都會寫,不過,這里一般程序員剛接觸Socket寫服務器,Http寫客戶端都會頭大——不可能吧,Socket用TCP/IP協議,客戶端用Http協議,不同協議間,怎么可能通訊呢!???
本文要說的就是這個問題了。???
大家一定都知道,網絡系統一共分7層,在這七層中,Http協議要高于TCP/IP協議(因為在互聯網中,計算機是通過IP定位的,也就是用TCP/IP協議了),對網絡操作系統有了解的人,一定不會忘記,我們用Http訪問www的時候,用的是域名,而域名,最終還是要通過DNS轉換成IP地址的。這就對了——HTTP協議基于TCP/IP協議!而Socket正是基于TCP/IP協議,這樣一來,它們就有了共同之外了!有了以上的認識,理論方面就沒問題了。???
我們再討論一下實現:???
服務器:???
和一般的C/S結構一樣,用Socket(java中用ServerSocket)監聽。監聽、讀寫消息的方面與一般的C/S服務器一模一樣。不同的是,考慮到客戶端只支持http協議,所以,讀客戶端消息的時候,讀到的將是http頭+消息,那么,我們便要用程序分析并去掉http頭,只用消息。發消息的時候正好相反,在發送的消息前面,自己加上http頭(其實就是一個包含一定內容的字符串),這樣再發出去,客戶端就可以收到并讀取了。?
客戶端:???
用Http連接,在java中,用的是HttpConnection.open("http://"+IP+":"+Port)訪問服務器,這樣,就可以向ServerSocket請求連接了。???
在open之后,再向HttpConnection對象的輸出流寫入消息,然后刷新流再關閉HttpConnection就可以了,客戶端因為本來用的就是http協議,所以不用自行加http頭,底層會處理的;服務器在Accept()之后,就可以從Socket的輸入流讀到消息了。當然,如果要讀服務器的消息的話,可以在HttpConnection關閉前讀它的輸入流(讀的時候,如果還沒有收到服務器消息,會阻塞當前線程的,直到讀到為止,不怕讀不到)。客戶端讀到的消息,是不包括http頭的,所以,也就不用我們自行處理了。?
要注意的是,HttpConnetion.open后,只能用一次,刷新后,它就無效了,得重新調用open方法再次建立連接。(服務器最好使用線程建立Socket與客戶端連接,連接一次一個線程。)???
現在在家里,未例的代碼放在公司了,明天如果記得的話,回公司上傳個示例代碼給大家借鑒。
服務器示例代碼:(共三個類)
//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;}//循環監聽 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對象得到輸入流,并構造相應的BufferedReader對象 is = new BufferedReader(new InputStreamReader(s.getInputStream()));//由Socket對象得到輸出流,并構造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();//立刻回發消息 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");}}//去掉協議頭,取出純消息 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 = "";}}}
客戶端示例代碼(主要部份):
記憶不是很好,找了很久,才找到我在第一個貼子第一句話說的貼子:
http://community.csdn.net/Expert/topic/4941/4941245.xml?temp=5.889529E-02
回樓上:
呵呵,也許真的是我太沒見識了呢!為此,我還真的回去翻了書:
TCP/IP:(傳輸控制協議/網間協議)Internet?的主要協議之一,按功能分層的話,相對于ISO模型中的網絡層、傳輸層。TCP/IP包含網絡層的IP協議與傳輸層的TCP等協議,它有自己的參考模型——TCP/IP網絡參考模型:應用層,傳輸層,網絡層,鏈路層。TCP協議是TCP/IP網絡中最常用的協議,位于傳輸層(UDP協議亦是如此)!
綜上所述:TCP/IP是一套協議,也是一個參考模型!與本貼并無矛盾!
Socket:也就是常說的套接字了,網絡上運行的程序之間雙向通信鏈路的最終結點,是TCP/UDP的基礎。
HTTP協議:Internet的主要協議之一:位于應用層。(比TCP所在的傳輸層高)。如果分析過Http通訊的人一定清楚,http協議不過是封裝了TCP協議而已。
總結
以上是生活随笔為你收集整理的在Socket做服务器,在手机上用Http访问的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将完整的XP(非PE)安装到U盘
- 下一篇: 如何自动修复XP/VISTA/WIN7系