步步測試完善Java中Socket通訊圖解法(二)

來源:互聯網
上載者:User

目錄

簡介

Java中Socket通訊簡介

單線程一對一伺服器1——>1用戶端

單線程一對一伺服器1<——>1用戶端

多線程一對多伺服器1<——>N用戶端【非聊天室的伺服器通過使用者輸入發送資料】

多線程一對多伺服器1<——>N用戶端【聊天室】

多線程最終伺服器和用戶端整合一體【swing程式】

       Java中Tcp協議Socket通訊測試步驟:     

  【單線程】一對一伺服器1——>1用戶端   

     介紹:當用戶端串連後,伺服器會發送訊息到用戶端。用戶端收到伺服器發送來的訊息,並輸出。      代碼如下:用戶端和伺服器端都在本機上測試。      伺服器    
package com17;import java.io.IOException;import java.io.PrintStream;import java.net.ServerSocket;import java.net.Socket;public class Server {     public static void main(String[] args) {          //建立月hi個ServerSocket,用於監聽用戶端Socket的串連請求          try {               ServerSocket ss=new ServerSocket(30000);               //採用死迴圈不斷接受來自用戶端的請求               while(true)               {                    //每當接受到用戶端socket的請求,服務端也對應產生一個socket                    Socket s=ss.accept();                    System.out.println("IP為"+s.getInetAddress()+"串連此伺服器");                    //將Socket對應的輸出資料流封裝成PrintStream                    PrintStream ps=new PrintStream(s.getOutputStream());                    //進行普通的io操作                    ps.println("用戶端您好,我是伺服器。");                    ps.close();                    s.close();                        }          } catch (IOException e) {               // TODO Auto-generated catch block               e.printStackTrace();          }              }}

   用戶端: 

package com17;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.net.Socket;public class Client {     public static void main(String[] args) {          try          {               Socket socket=new Socket("127.0.0.1",30000);               //將socket對應的輸入資料流封裝成BufferedReader               BufferedReader br=new BufferedReader( new InputStreamReader(socket.getInputStream()));                             //進行普通的io操作               String line=br.readLine();               System.out.println("來自伺服器的資料::"+line);               br.close();               socket.close();          }          catch(IOException e)          {               e.printStackTrace();          }              }}

  效果如下:      

【單線程】一對一伺服器1<——>1用戶端    

      介紹:伺服器和用戶端分別接受對方發送的資訊,然後再發送資料到對方。      若是發送已經編譯好的資料,則這塊是很簡單的。      在第一個demo的基礎上,修改伺服器端的main方法:      伺服器端:     
                  while( true)                {                      //每當接受到用戶端socket的請求,服務端也對應產生一個socket                     Socket s=ss.accept();                     System. out.println( "IP為"+s.getInetAddress()+ "串連此伺服器" );                      //接受用戶端發送的資料                     BufferedReader br= new BufferedReader( new InputStreamReader(s.getInputStream()));                     System. out.println( "來自用戶端的資料:" +br.readLine());                      //將Socket對應的輸出資料流封裝成PrintStream                     PrintStream ps= new PrintStream(s.getOutputStream());                      //進行普通的 io操作                     ps.println( "用戶端您好,我是伺服器。" );                     ps.close();                     br.close();                     s.close();                      }

  用戶端: 

            try           {                Socket socket=new Socket("127.0.0.1",30000);                 //發送資料                PrintStream ps= new PrintStream(socket.getOutputStream());                ps.println( "您好,我是用戶端" );                 //將socket對應的輸入資料流封裝成BufferedReader                BufferedReader br= new BufferedReader( new InputStreamReader(socket.getInputStream()));                 //進行普通的io操作                String line=br.readLine();                System. out.println( "來自伺服器的資料::" +line);                br.close();                ps.close();                 socket.close();           }
效果如下:       注意:伺服器和用戶端互相發送的資料都是已經編譯好的。但是通常情況下,我們發送資料,都是想發什麼就發什麼,所以呢,應該通過鍵盤輸入來發送資料。      但是通過鍵盤輸入,需要監聽使用者鍵盤輸入。這個鍵盤輸入會有一定的問題。      比如用戶端發送資料如下:還是在上述demo的Client端基礎上:     
                //擷取該socket對應的輸出資料流              PrintStream ps= new PrintStream(s.getOutputStream());              String line= null;              //不斷讀取鍵盤的輸入              BufferedReader br= new BufferedReader( new InputStreamReader(System.in));              while((line=br.readLine())!= null)              {                   //將使用者的鍵盤輸入內容寫入socket對應的輸出資料流                   ps.println(line);              }

     

      請注意看system.in這個方法,則程式一直在死迴圈中,則無法執行下面的接受伺服器方法。      也許你說,那直接在迴圈中,發送完畢後,直接接受。      但是這種辦法,就會造成,你在dos視窗中只能發一條語句,然後,等待接受。      那該怎麼辦呢?我想發送資料和我的接受資料不相關分離,並不是硬生生滴綁定在一塊。

   

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.