欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
TCP/IP協(xié)議(Socket)做服務(wù)器,HTTP協(xié)議做客戶(hù)端

TCP/IP協(xié)議(Socket)做服務(wù)器,HTTP協(xié)議做客戶(hù)端

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

 

Java代碼
 
  1. 服務(wù)器示例代碼:(共三個(gè)類(lèi))      
  2.   //HttpServer.java      
  3.   package   testnetserver;      
  4.        
  5.   public   class   HttpServer{      
  6.   public   HttpServer()   {      
  7.   }      
  8.   public   static   void   main(String[]   aregs){      
  9.   HttpServerSocket   hss=new   HttpServerSocket();      
  10.   hss.start();      
  11.   }      
  12.   }      
  13.        
  14.        
  15.        
  16.        
  17.        
  18.        
  19.   //HttpServerSocket.java      
  20.   package   testnetserver;      
  21.        
  22.   import   java.net.ServerSocket;      
  23.   import   java.io.*;      
  24.        
  25.   public   class   HttpServerSocket   extends   Thread{      
  26.   ServerSocket   ss=null;      
  27.   private   static   final   int   port=2222;      
  28.   public   HttpServerSocket()   {      
  29.   }      
  30.   public   void   run(){      
  31.   try   {      
  32.   ss   =   new   ServerSocket(port);      
  33.   }      
  34.   catch   (IOException   ex)   {      
  35.   System.out.println("ServerSocket   can   not   listen");      
  36.   System.out.println("Error   on   ServerSocket   bind   port");      
  37.   ex.printStackTrace();      
  38.   ss=null;      
  39.   return;      
  40.   }      
  41.   //循環(huán)監聽(tīng)      
  42.   while(true){      
  43.   HttpSocket   hs=null;      
  44.   try   {      
  45.   hs=new   HttpSocket();      
  46.   hs.s=ss.accept();      
  47.   System.out.println("have   a   client   connect");      
  48.   hs.start();      
  49.   }      
  50.   catch   (IOException   ex1)   {      
  51.   System.out.println("Error   on   accept");      
  52.   }      
  53.   }      
  54.   }      
  55.   }      
  56.        
  57.        
  58.        
  59.        
  60.        
  61.        
  62.   //HttpSocket.java      
  63.   package   testnetserver;      
  64.        
  65.   import   java.net.Socket;      
  66.   import   java.io.*;      
  67.        
  68.   public   class   HttpSocket      
  69.   extends   Thread   {      
  70.   public   Socket   s   =   null;      
  71.   String   msg   =   "";      
  72.   public   HttpSocket()   {      
  73.   }      
  74.        
  75.   public   void   run()   {      
  76.   BufferedReader   is   =   null;      
  77.   PrintWriter   os   =   null;      
  78.   try   {      
  79.   //由Socket對象得到輸入流,并構造相應的BufferedReader對象      
  80.   is   =   new   BufferedReader(new   InputStreamReader(s.getInputStream()));      
  81.   //由Socket對象得到輸出流,并構造PrintWriter對象      
  82.   os   =   new   PrintWriter(s.getOutputStream());      
  83.   }      
  84.   catch   (IOException   ex)   {      
  85.   System.out.println("Error   on   get   Buffere");      
  86.   }      
  87.        
  88.   String   temp   =   "";      
  89.   try   {      
  90.   temp   =   is.readLine();      
  91.   while   (temp   !=   null)   {      
  92.   msg   +=   temp;      
  93.   if   (temp.length()   >   4   &&      
  94.   temp.substring(temp.length()   -   4).equals("/End"))   {      
  95.   temp   =   is.readLine();   //虛讀      
  96.   temp   =   null;      
  97.   break;      
  98.   }      
  99.   msg   +=   "\r\n";      
  100.   temp   =   is.readLine();      
  101.   }      
  102.   getMsg();      
  103.   //立刻回發(fā)消息      
  104.   msg   =   "Begin/"   +   msg   +   "/End";      
  105.   os.write("HTTP/1.1   200   OK\r\n");      
  106.   os.write("Content-Type:   text;   charset=utf\r\n");      
  107.   os.write(   ("Content-Length:   "   +   msg.length()   +   "\r\n"));      
  108.   os.write("\r\n");      
  109.   os.write(msg);      
  110.   os.flush();      
  111.   msg   =   "";      
  112.   }      
  113.   catch   (IOException   ex1)   {      
  114.   System.out.println("Error   on   read   or   write   Buffered");      
  115.   ex1.printStackTrace();      
  116.   }      
  117.   try   {      
  118.   sleep(100);      
  119.   }      
  120.   catch   (InterruptedException   ex2)   {      
  121.   System.out.println("Error   on   HttpSocket   sleep");      
  122.   }      
  123.   }      
  124.        
  125.   //去掉協(xié)議頭,取出純消息      
  126.   private   void   getMsg()   {      
  127.   int   begin   =   msg.indexOf("Begin/");      
  128.   int   end   =   msg.indexOf("/End");      
  129.   if   (begin   >=   0   &&   end   >   0   &&   msg.length()>"Begin/".length())   {      
  130.   msg   =   msg.substring(begin   +   "Begin/".length(),   end);      
  131.   System.out.println(msg);      
  132.   }      
  133.   else   {      
  134.   msg   =   "";      
  135.   }      
  136.   }      
  137.   }     

 

 

Java代碼
 
  1. 客戶(hù)端示例代碼(主要部份):      
  2.   public   void   run()   {      
  3.   HttpConnection   conn   =   null;      
  4.   DataInputStream   dis   =   null;      
  5.   DataOutputStream   dos   =   null;      
  6.   int   begin   =   0,   end   =   0;      
  7.   byte   temp[]   =   new   byte[10000];      
  8.   int   len   =   0;      
  9.   try   {      
  10.   conn   =   (HttpConnection)   Connector.open("http://"   +   IP   +   ":"   +      
  11.   port);      
  12.                           //寫(xiě)輸出流(向服務(wù)器發(fā)送信息)      
  13.   dos   =   conn.openDataOutputStream();      
  14.   msg   =   "Begin/"   +   msg+"/End";      
  15.   //dos.writeUTF(msg);      
  16.   dos.write(msg.getBytes());      
  17.   dos.flush();      
  18.   dos.close();      
  19.   if   (!isTestConnectTime)   {      
  20.   dataLenght   =   msg.length();      
  21.   }      
  22.   backTime   =   0;      
  23.   //讀輸入流(讀服務(wù)器消息)      
  24.   dis   =   conn.openDataInputStream();      
  25.   len   =   dis.read(temp);      
  26.   if   (len   >   0)   {      
  27.   receiveMsg   =   "";      
  28.   for   (int   i   =   0;   i   <   len;   i++)   {      
  29.   receiveMsg   +=   (char)   temp[i];      
  30.   }      
  31.   }      
  32.        
  33.   if   (receiveMsg.length()   >   0)   {      
  34.   begin   =   receiveMsg.indexOf("Begin/");      
  35.   end   =   receiveMsg.indexOf("/End");      
  36.   if   (begin   >=   0   &&   end   >   0)   {      
  37.   receiveMsg   =   receiveMsg.substring(begin   +      
  38.   "Begin/".length(),   end);      
  39.   if   (receiveMsg   !=   null   &&   receiveMsg.trim()   !=   ""   &&      
  40.   receiveMsg.length()   >   0)   {      
  41.   System.out.println(receiveMsg);      
  42.   testCount++;      
  43.   if   (!isTestConnectTime)   {      
  44.   allDataLenght   +=   dataLenght;      
  45.   }      
  46.   }      
  47.   }      
  48.   }      
  49.   //dos.close();      
  50.   dis.close();      
  51.   conn.close();      
  52.   }      
  53.   catch   (Exception   ex1)   {      
  54.   System.out.println("Error   on   send   message");      
  55.   ex1.printStackTrace();      
  56.   }      
  57.   }  
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
java socket編程的一個(gè)例子(線(xiàn)程池)
socket1
從0手寫(xiě)實(shí)現Tomcat
App Inventor插件開(kāi)發(fā)(六)WiFi局域網(wǎng)socket通信
JAVA實(shí)現遠程文件讀取
用Java實(shí)現多線(xiàn)程服務(wù)器程序
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久