TCP/IP簡單介紹

tcp/ip只是一個協(xié)議族的稱號,就是說一個家族的意思。它里面有各種協(xié)議惕橙,比如 ip協(xié)議、ftp協(xié)議钉跷、udp協(xié)議弥鹦。Java中為使用TCP協(xié)議提供了二個類 Socket和ServerSocket,一般的socket模式中爷辙,Serversocket只有一個彬坏,Socket而有
多個。

TCP連接建立步驟

客戶端和服務(wù)端建立連接后膝晾,就被動的等待服務(wù)器的響應(yīng)栓始。典型的TCP客戶端要經(jīng)過以下步驟。

客戶端

  1. 創(chuàng)建一個Socket實(shí)例血当,構(gòu)造函數(shù)指定遠(yuǎn)程主機(jī)的IP地址和端口號幻赚。
  • 通過Socket的I/O流來和服務(wù)器進(jìn)行通信
  • 使用Socket的close來關(guān)閉連接。

服務(wù)端

  1. 創(chuàng)建一個ServerSocket實(shí)例指定本地端口臊旭,監(jiān)聽客戶端在該端口發(fā)起的TCP請求
  2. 重新執(zhí)行accept方法來獲取客戶端的連接
  3. 為獲取的客戶端開啟一個新線程落恼,利用I/O流和客戶端進(jìn)行通信。通信完成調(diào)用客戶端的close方法關(guān)閉流离熏。

下面通過代碼來體現(xiàn)上面說的步驟

Socket

Socket就是一個客戶端佳谦,可以和ServerSocket建立起連接,建立連接后就可以和Server進(jìn)行通信了撤奸。創(chuàng)建一個Socket要指定IP地址和端口號吠昭。每個Socket都會關(guān)聯(lián)一個InputStream和OutPutSteram喊括,我們通過 把字節(jié)寫入套接字的OutOutStream來發(fā)送數(shù)據(jù),并且通過InputSrteam來接收數(shù)據(jù)矢棚。

  public static void main(String[] args) throws IOException {
          //客戶端請求與本機(jī)在20006端口建立TCP連接
          Socket client = new Socket("127.0.0.1", 1217);
          client.setSoTimeout(10000);
          //獲取鍵盤輸入
          BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
          //獲取Socket的輸出流郑什,用來發(fā)送數(shù)據(jù)到服務(wù)端
          PrintStream out = new PrintStream(client.getOutputStream());
          //獲取Socket的輸入流,用來接收從服務(wù)端發(fā)送過來的數(shù)據(jù)
          BufferedReader buf =  new BufferedReader(new InputStreamReader(client.getInputStream()));
          boolean flag = true;
          while(flag){
              System.out.print("輸入信息:");
              String str = input.readLine();
              //發(fā)送數(shù)據(jù)到服務(wù)端
              out.println(str);
              if("bye".equals(str)){
                  flag = false;
              }else{
                  try{
                      //從服務(wù)器端接收數(shù)據(jù)有個時(shí)間限制(系統(tǒng)自設(shè)蒲肋,也可以自己設(shè)置)蘑拯,超過了這個時(shí)間,便會拋出該異常
                      String echo = buf.readLine();
                      System.out.println(echo);
                  }catch(SocketTimeoutException e){
                      System.out.println("Time out, No response");
                  }
              }
          }
          input.close();
          if(client != null){
              //如果構(gòu)造函數(shù)建立起了連接兜粘,則關(guān)閉套接字申窘,如果沒有建立起連接,自然不用關(guān)閉
              client.close(); //只關(guān)閉socket孔轴,其關(guān)聯(lián)的輸入輸出流也會被關(guān)閉
          }
      }


ServerSocket

服務(wù)端的工作就是建立一個通信端剃法,被動等待客戶端的連接請求。

   public static void main(String[] args) throws Exception{
           //開啟一個服務(wù)端路鹰,端口號1217
           ServerSocket server = new ServerSocket(1217);
           Socket client = null;
           boolean f = true;
           while(f){
            System.out.println("服務(wù)開啟成功贷洲!");
               //等待客戶端的連接,會一直等待晋柱。
               client = server.accept();
               System.out.println("與客戶端連接成功优构!");
               //為每個客戶端連接開啟一個線程
               new Thread(new ServerThread(client)).start();
           }
           server.close();
       }


    public static class ServerThread implements Runnable {

        private Socket client = null;
        public ServerThread(Socket client){
            this.client = client;
        }

        @Override
        public void run() {
            try{
                //獲取Socket的輸出流,用來向客戶端發(fā)送數(shù)據(jù)
                PrintStream out = new PrintStream(client.getOutputStream());
                //獲取Socket的輸入流雁竞,通過它來獲取客戶端發(fā)送的信息钦椭。
                BufferedReader buf = new BufferedReader(new InputStreamReader(client.getInputStream()));
                boolean flag =true;
                while(flag){
                    //接收從客戶端發(fā)送過來的數(shù)據(jù)
                    String str =  buf.readLine();
                    System.out.println(str);
                    if(str == null || "".equals(str)){
                        flag = false;
                    }else{
                        if("bye".equals(str)){
                            flag = false;
                        }else{
                            //將接收到的字符串前面加上echo,發(fā)送到對應(yīng)的客戶端
                            out.println("服務(wù)器收到了信息:" + str);
                        }
                    }
                }
                out.close();
                client.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
    }

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碑诉,一起剝皮案震驚了整個濱河市彪腔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌联贩,老刑警劉巖漫仆,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捎拯,死亡現(xiàn)場離奇詭異泪幌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)署照,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門祸泪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人建芙,你說我怎么就攤上這事没隘。” “怎么了禁荸?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵右蒲,是天一觀的道長阀湿。 經(jīng)常有香客問我,道長瑰妄,這世上最難降的妖魔是什么陷嘴? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮间坐,結(jié)果婚禮上灾挨,老公的妹妹穿的比我還像新娘。我一直安慰自己竹宋,他們只是感情好劳澄,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜈七,像睡著了一般秒拔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上飒硅,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天溯警,我揣著相機(jī)與錄音,去河邊找鬼狡相。 笑死梯轻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尽棕。 我是一名探鬼主播喳挑,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滔悉!你這毒婦竟也來了伊诵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤回官,失蹤者是張志新(化名)和其女友劉穎曹宴,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歉提,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡笛坦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了苔巨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片版扩。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖侄泽,靈堂內(nèi)的尸體忽然破棺而出礁芦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布柿扣,位于F島的核電站肖方,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏未状。R本人自食惡果不足惜窥妇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望娩践。 院中可真熱鬧活翩,春花似錦、人聲如沸翻伺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吨岭。三九已至拉宗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辣辫,已是汗流浹背旦事。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留急灭,地道東北人姐浮。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像葬馋,于是被迫代替她去往敵國和親卖鲤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容