posts - 297,  comments - 1618,  trackbacks - 0
          最近對(duì)Socket有初次接觸,對(duì)其比較感興趣,參考網(wǎng)上的Socket編程實(shí)例,修改了部分內(nèi)容后,寫了一個(gè)Socket的Server端和Cliet端收發(fā)數(shù)據(jù)的小例子。

              該實(shí)例完成的功能如下:

              一次啟動(dòng)Server端和Client端后,首先由Server端發(fā)‘1’給Client端,Client端將接收到的數(shù)據(jù)加1后,發(fā)該數(shù)據(jù)給Server端,Server端再將數(shù)據(jù)加1后發(fā)給Client端,依次類推。直到Server端收到數(shù)據(jù)20,Client收到19時(shí),兩方中斷收發(fā)。

              程序代碼如下:

          1.    Socket Server
          /**
           * Socket的Server舉例
           * 
          @author Amigo Xie(xiexingxing1121@126.com)
           * 
          @since 2006/12/28
           
          */

          public class SocketServer {
              ServerSocket serverSocket 
          = null;
              Socket socket 
          = null;
              DataInputStream inStream 
          = null;
              DataOutputStream outStream 
          = null;
              
              
              
          public static void main(String[] args) {
                  SocketServer socketServer 
          = new SocketServer();
                  socketServer.waitForClient();
              }

              
              
          public SocketServer() {
                  
          try {
                      serverSocket 
          = new ServerSocket(6600);
                  }
           catch(Exception e) {
                      e.printStackTrace();
                  }

              }

              
              
          void waitForClient() {
                  
          try {
                      socket 
          = serverSocket.accept();
                      inStream 
          = new DataInputStream(socket.getInputStream());
                      outStream 
          = new DataOutputStream(socket.getOutputStream());
                      outStream.writeUTF(
          "1");
                      socket.setSoTimeout(
          3000);
                      acceptAndSendData();
                  }
           catch(Exception e) {
                      e.printStackTrace();
                  }

              }


              
          void acceptAndSendData(){
                  
          while(true{
                      
          try {
                          String acceptStr 
          = inStream.readUTF();
                          System.out.println(
          "Server accept:" + acceptStr);
                          
          int num = Integer.parseInt(acceptStr) + 1;
                          
          if(num > 20{
                              System.out.println(
          "Send end!");
                              
          break;
                          }
           else {
                              String sendStr 
          = Integer.toString(num);
                              outStream.writeUTF(sendStr);
                          }

                      }
           catch(Exception e) {
                          e.printStackTrace();
                          
          break;
                      }

                  }

              }

          }

           2. Socket Client端代碼
          /**
           * Socket的Client舉例
           * 
          @author Amigo Xie(xiexingxing1121@126.com)
           * 
          @since 2006/12/28
           
          */

          public class SocketCliet {

              Socket socket 
          = null;

              DataInputStream inStream 
          = null;

              DataOutputStream outStream 
          = null;

              
          public static void main(String[] args) {
                  SocketCliet socketCliet 
          = new SocketCliet();
              }


              
          public SocketCliet() {
                  
          try {
                      init();
                      waitData();
                  }
           catch (Exception e) {
                      e.printStackTrace();
                  }

              }


              
          void init() throws Exception {
                  socket 
          = new Socket("127.0.0.1"6600);
                  inStream 
          = new DataInputStream(socket.getInputStream());
                  outStream 
          = new DataOutputStream(socket.getOutputStream());
                  socket.setSoTimeout(
          3000);
              }

              
              
          void waitData() {
                  
          boolean flag = true;
                  
          while (flag) {
                      
          try {
                          String acceptStr 
          = inStream.readUTF();
                          System.out.println(
          "Client accept: " + acceptStr);
                          String sendStr 
          = Integer.toString(Integer.parseInt(acceptStr) + 1);
                          outStream.writeUTF(sendStr);
                          
          if(Integer.parseInt(sendStr) >= 20{
                              flag 
          = false;
                          }

                      }
           catch (Exception e) {
                          e.printStackTrace();
                          
          break;
                      }

                  }

              }

          }
          在調(diào)試時(shí),由于編碼的失誤,因?yàn)樵赟erver端有超過20時(shí)跳出while的判斷,而Client類中未加:

             if(Integer.parseInt(sendStr) >= 20) {
                   flag = false;
              }

              來使程序跳出循環(huán),程序報(bào)出了如下錯(cuò)誤:java.net.SocketException: Connection reset。。。。。。

            引起該問題的原因是由于此時(shí)Server端連接已經(jīng)被復(fù)位,而Client依然通過該連接在接收和發(fā)送數(shù)據(jù),在網(wǎng)上搜索了一下該錯(cuò)誤,發(fā)現(xiàn)該錯(cuò)誤引起的原因大都是防火墻的原因,嘿嘿,又學(xué)了一招。

                過幾天繼續(xù)研究Socket通信編程,寫了好的實(shí)用的例子繼續(xù)帖上來 :)

          posted on 2007-02-11 23:37 阿蜜果 閱讀(18253) 評(píng)論(2)  編輯  收藏 所屬分類: 網(wǎng)絡(luò)通信相關(guān)


          FeedBack:
          # re: Socket編程實(shí)例--一個(gè)Socket Server和Client端實(shí)現(xiàn)數(shù)據(jù)收發(fā)的例子 [未登錄]
          2010-06-05 15:37 | 白菜
          幾年前我還是一個(gè)學(xué)生的時(shí)候,無意中看到博主的博客,讓我學(xué)習(xí)了不少的東西.于是特地將博主的博客地址加入我鮮少使用的收藏夾中,可是后來無意中丟了,時(shí)光飛逝.今天再搜一個(gè)問題的時(shí)候,無意中又來到博主的博客,感觸時(shí)光飛逝,真的很深!  回復(fù)  更多評(píng)論
            
          # re: Socket編程實(shí)例--一個(gè)Socket Server和Client端實(shí)現(xiàn)數(shù)據(jù)收發(fā)的例子
          2011-12-29 14:42 | albrich
          我目前也再研究這個(gè)東西,但是不知道為什么總是出錯(cuò),很希望你能聯(lián)系我,Q:904755058  回復(fù)  更多評(píng)論
            
          <2007年2月>
          28293031123
          45678910
          11121314151617
          18192021222324
          25262728123
          45678910

                生活將我們磨圓,是為了讓我們滾得更遠(yuǎn)——“圓”來如此。
                我的作品:
                玩轉(zhuǎn)Axure RP  (2015年12月出版)
                

                Power Designer系統(tǒng)分析與建模實(shí)戰(zhàn)  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關(guān)注blog

          積分與排名

          • 積分 - 2296322
          • 排名 - 3

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 新营市| 清河县| 大余县| 突泉县| 新竹市| 黔江区| 囊谦县| 钦州市| 太谷县| 华容县| 乌海市| 嘉善县| 台前县| 德阳市| 溆浦县| 靖西县| 邵东县| 始兴县| 新密市| 嘉祥县| 沾化县| 寿阳县| 疏勒县| 巫山县| 涪陵区| 株洲县| 南皮县| 攀枝花市| 南岸区| 长岭县| 水富县| 平舆县| 秦皇岛市| 镇雄县| 阿拉尔市| 宜黄县| 自贡市| 万州区| 丰都县| 区。| 当雄县|