posts - 297,  comments - 1618,  trackbacks - 0
          最近對Socket有初次接觸,對其比較感興趣,參考網上的Socket編程實例,修改了部分內容后,寫了一個Socket的Server端和Cliet端收發數據的小例子。

              該實例完成的功能如下:

              一次啟動Server端和Client端后,首先由Server端發‘1’給Client端,Client端將接收到的數據加1后,發該數據給Server端,Server端再將數據加1后發給Client端,依次類推。直到Server端收到數據20,Client收到19時,兩方中斷收發。

              程序代碼如下:

          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;
                      }

                  }

              }

          }
          在調試時,由于編碼的失誤,因為在Server端有超過20時跳出while的判斷,而Client類中未加:

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

              來使程序跳出循環,程序報出了如下錯誤:java.net.SocketException: Connection reset。。。。。。

            引起該問題的原因是由于此時Server端連接已經被復位,而Client依然通過該連接在接收和發送數據,在網上搜索了一下該錯誤,發現該錯誤引起的原因大都是防火墻的原因,嘿嘿,又學了一招。

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

          posted on 2007-02-11 23:37 阿蜜果 閱讀(18253) 評論(2)  編輯  收藏 所屬分類: 網絡通信相關


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

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

                Power Designer系統分析與建模實戰  (2015年7月出版)
                
               Struts2+Hibernate3+Spring2   (2010年5月出版)
               

          留言簿(263)

          隨筆分類

          隨筆檔案

          文章分類

          相冊

          關注blog

          積分與排名

          • 積分 - 2296332
          • 排名 - 3

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 惠安县| 兴国县| 会理县| 屏南县| 泽州县| 息烽县| 阳泉市| 宾阳县| 福贡县| 景东| 永春县| 青阳县| 高青县| 汝城县| 丹江口市| 泸定县| 南充市| 九龙坡区| 荣昌县| 孟津县| 资兴市| 舞钢市| 高淳县| 元阳县| 延津县| 怀来县| 衡东县| 鄂伦春自治旗| 漳平市| 盐池县| 富阳市| 海原县| 定襄县| 诸城市| 永川市| 赤峰市| 西丰县| 勃利县| 南召县| 临颍县| 项城市|