<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    Java Socket網絡編程的經典例子(轉)

     事實上網絡編程簡單的理解就是兩臺計算機相互通訊數據而已,對于程序員而言,去掌握一種編程接口并使用一種編程模型相對就會顯得簡單的多了,Java SDK提供一些相對簡單的Api來完成這些工作。Socket就是其中之一,對于Java而言,這些Api存在與java.net 這個包里面,因此只要導入這個包就可以準備網絡編程了。 

    網絡編程的基本模型就是客戶機到服務器模型,簡單的說就是兩個進程之間相互通訊,然后其中一個必須提供一個固定的位置,而另一個則只需要知道這個固定的位置。并去建立兩者之間的聯系,然后完成數據的通訊就可以了,這里提供固定位置的通常稱為服務器,而建立聯系的通常叫做客戶端,基于這個簡單的模型,就可以進入網絡編程啦。 

     Java對這個模型的支持有很多種Api,而這里我只想介紹有關Socket的編程接口,對于Java而言已經簡化了Socket的編程接口。首先我們來討論有關提供固定位置的服務方是如何建立的。Java提供了ServerSocket來對其進行支持.事實上當你創建該類的一個實力對象并提供一個端口資源你就建立了一個固定位置可以讓其他計算機來訪問你,ServerSocket server
    =new ServerSocket(6789);這里稍微要注意的是端口的分配必須是唯一的。因為端口是為了唯一標識每臺計算機唯一服務的,另外端口號是從0~65535之間的,前1024個端口已經被Tcp/Ip 作為保留端口,因此你所分配的端口只能是1024個之后的。好了,我們有了固定位置.現在所需要的就是一根連接線了.該連接線由客戶方首先提出要求。因此Java同樣提供了一個Socket對象來對其進行支持,只要客戶方創建一個Socket的實例對象進行支持就可以了。Socket client 

    =new Socket(InetAddress.getLocalHost(),5678);客戶機必須知道有關服務器的IP地址,對于著一點Java也提供了一個相關的類InetAddress 該對象的實例必須通過它的靜態方法來提供,它的靜態方法主要提供了得到本機IP 和通過名字或IP直接得到InetAddress的方法。 



    上面的方法基本可以建立一條連線讓兩臺計算機相互交流了,可是數據是如何傳輸的呢?事實上I
    /O操作總是和網絡編程息息相關的。因為底層的網絡是繼續數據的,除非遠程調用,處理問題的核心在執行上,否則數據的交互還是依賴于IO操作的,所以你也必須導入java.io這個包.java的IO操作也不復雜,它提供了針對于字節流和Unicode的讀者和寫者,然后也提供了一個緩沖用于數據的讀寫。 

     

     

    BufferedReader in
    =new BufferedReader(new InputStreamReader(server.getInputStream())); 

    PrintWriter out
    =new PrintWriter(server.getOutputStream()); 

     

    上面兩句就是建立緩沖并把原始的字節流轉變為Unicode可以操作,而原始的字節流來源于Socket的兩個方法,getInputStream()和getOutputStream()方,分別用來得到輸入和輸出,那么現在有了基本的模型和基本的操作工具,我們可以做一個簡單的Socket例程了. 

     

    服務方: 

     

     

    import java.io.*

    import java.net.*

    public class MyServer 

    public static void main(String[] args) throws IOException

    ServerSocket server
    =new ServerSocket(5678); 

    Socket client
    =server.accept(); 

    BufferedReader in
    =new BufferedReader(new InputStreamReader(client.getInputStream())); 

    PrintWriter out
    =new PrintWriter(client.getOutputStream()); 

    while(true)

    String str
    =in.readLine(); 

    System.out.println(str); 

    out.println(
    "has receive."); 

    out.flush(); 

    if(str.equals("end")) 

    break

    }
     

    client.close(); 

    }
     

    }
     

     

    這個程序的主要目的在于服務器不斷接收客戶機所寫入的信息只到,客戶機發送
    "End"字符串就退出程序,并且服務器也會做出"Receive"為回應,告知客戶機已接收到消息。 

     

    客戶機代碼: 

     

     

    import java.net.*

    import java.io.*

     

    public class Client

    static Socket server; 

     

    public static void main(String[] args)throws Exception

    server
    =new Socket(InetAddress.getLocalHost(),5678); 

    BufferedReader in
    =new BufferedReader(new InputStreamReader(server.getInputStream())); 

    PrintWriter out
    =new PrintWriter(server.getOutputStream()); 

    BufferedReader wt
    =new BufferedReader(new InputStreamReader(System.in)); 

     

    while(true)

    String str
    =wt.readLine(); 

    out.println(str); 

    out.flush(); 

    if(str.equals("end"))

    break

    }
     

    System.out.println(in.readLine()); 

    }
     

    server.close(); 

    }
     

    }
     



     客戶機代碼則是接受客戶鍵盤輸入,并把該信息輸出,然后輸出
    "End"用來做退出標識。 

     

    這個程序只是簡單的兩臺計算機之間的通訊,如果是多個客戶同時訪問一個服務器呢?你可以試著再運行一個客戶端,結果是會拋出異常的。那么多個客戶端如何實現呢
    ? 

     

    其實,簡單的分析一下,就可以看出客戶和服務通訊的主要通道就是Socket本身,而服務器通過accept方法就是同意和客戶建立通訊.這樣當客戶建立Socket的同時。服務器也會使用這一根連線來先后通訊,那么既然如此只要我們存在多條連線就可以了。那么我們的程序可以變為如下: 

     

    服務器: 

     

     

    import java.io.*

    import java.net.*

     

    public class MyServer 

    public static void main(String[] args) throws IOException

    ServerSocket server
    =new ServerSocket(5678); 

    while(true)

    Socket client
    =server.accept(); 

    BufferedReader in
    =new BufferedReader(new InputStreamReader(client.getInputStream())); 

    PrintWriter out
    =new PrintWriter(client.getOutputStream()); 

    while(true)

    String str
    =in.readLine(); 

    System.out.println(str); 

    out.println(
    "has receive."); 

    out.flush(); 

    if(str.equals("end")) 

    break

    }
     

    client.close(); 

    }
     

    }
     

    }
     

     

    這里僅僅只是加了一個外層的While循環,這個循環的目的就是當一個客戶進來就為它分配一個Socket直到這個客戶完成一次和服務器的交互,這里也就是接受到客戶的
    "End"消息.那么現在就實現了多客戶之間的交互了。但是.問題又來了,這樣做雖然解決了多客戶,可是是排隊執行的。也就是說當一個客戶和服務器完成一次通訊之后下一個客戶才可以進來和服務器交互,無法做到同時服務,那么要如何才能同時達到既能相互之間交流又能同時交流呢?很顯然這是一個并行執行的問題了。所以線程是最好的解決方案。 

     

    那么下面的問題是如何使用線程.首先要做的事情是創建線程并使得其可以和網絡連線取得聯系。然后由線程來執行剛才的操作,要創建線程要么直接繼承Thread要么實現Runnable接口,要建立和Socket的聯系只要傳遞引用就可以了.而要執行線程就必須重寫run方法,而run方法所做的事情就是剛才單線程版本main所做的事情,因此我們的程序變成了這樣: 

     

     

    import java.net.*

    import java.io.*

     

    public class MultiUser extends Thread

    private Socket client; 

     

    public MultiUser(Socket c)

    this.client=c; 

    }
     

     

    public void run()

    try

    BufferedReader in
    =new BufferedReader(new InputStreamReader(client.getInputStream())); 

    PrintWriter out
    =new PrintWriter(client.getOutputStream()); 

    //Mutil User but can't parallel 

    while(true)

    String str
    =in.readLine(); 

    System.out.println(str); 

    out.println(
    "has receive."); 

    out.flush(); 

    if(str.equals("end")) 

    break

    }
     

    client.close(); 

    }
    catch(IOException ex)

    }
    finally

    }
     

    }
     

     

    public static void main(String[] args)throws IOException

    ServerSocket server
    =new ServerSocket(5678); 

    while(true)

    //transfer location change Single User or Multi User 

    MultiUser mu
    =new MultiUser(server.accept()); 

    mu.start(); 

    }
     

    }
     

    }
     

     

    我的類直接從Thread類繼承了下來.并且通過構造函數傳遞引用和客戶Socket建立了聯系,這樣每個線程就有了。一個通訊管道.同樣我們可以填寫run方法,把之前的操作交給線程來完成,這樣多客戶并行的Socket就建立起來了。


    本文來自CSDN博客,轉載請標明出處:http:
    //blog.csdn.net/JaunLee/archive/2007/09/29/1805760.aspx

    posted on 2009-06-05 11:19 都市淘沙者 閱讀(35418) 評論(3)  編輯  收藏 所屬分類: 多線程并發編程

    評論

    # re: Java Socket網絡編程的經典例子(轉) 2015-06-24 17:25 sdf

    asdasdasdsad  回復  更多評論   

    # re: Java Socket網絡編程的經典例子(轉) 2015-10-13 13:06 減肥拉升

    5678是什么?這里的端口號是啥端口號  回復  更多評論   

    # re: Java Socket網絡編程的經典例子(轉) 2016-02-12 18:53 羊羊羊

    @減肥拉升
    5678是端口號,從1024以后隨便定義的,博主寫的非常好,很受益,謝謝  回復  更多評論   

    主站蜘蛛池模板: 久久国产精品一区免费下载| 男男AV纯肉无码免费播放无码| 亚洲国产国产综合一区首页| 成年人免费的视频| 免费人成视频在线播放| 亚洲综合日韩中文字幕v在线| 欧洲美熟女乱又伦免费视频| 国产免费阿v精品视频网址| 一本色道久久88亚洲精品综合| 亚洲精品偷拍视频免费观看 | 亚洲av无码专区在线观看亚| 亚洲国产婷婷六月丁香| 在线看免费观看AV深夜影院| eeuss影院ss奇兵免费com| 亚洲国产成人久久| 亚洲色自偷自拍另类小说| 免费无遮挡无码视频网站| 无码国产精品一区二区免费3p| 国产成人综合亚洲绿色| 亚洲激情校园春色| 国产亚洲视频在线播放| 免费视频淫片aa毛片| 222www在线观看免费| 在线视频网址免费播放| 亚洲日韩在线中文字幕综合| 亚洲欧洲春色校园另类小说| 中文字幕第一页亚洲| 日本免费人成视频播放| 国产h肉在线视频免费观看| 三年在线观看免费观看完整版中文| 在线观看日本亚洲一区| 亚洲美女一区二区三区| 亚洲日本韩国在线| 全免费一级午夜毛片| 久久www免费人成看片| 久久精品免费观看| 国产精品一区二区三区免费| 亚洲AV成人精品一区二区三区| 亚洲人成日本在线观看| 噜噜噜亚洲色成人网站∨| 亚洲女久久久噜噜噜熟女|