網路通訊之socket

 

網絡通訊的三要素:數組

    1.  IP:              設備的標識服務器

    2.  端口號:     進程間共同的標識網絡

    3.  傳輸協議:多線程

                   UDP協議:  面向無鏈接,數據被封裝(在64k之內),不可靠(速度快)。   運用實例: 聊天併發

                   TCP協議  :   面向鏈接,創建雙方數據通道,須要三次握手,可靠(速度慢)。運用實例: 打電話socket

                   簡單的說:UDP以包形式發送數據,可是不可靠,可能會丟包。TCP以流形式發送數據,可靠,可是效率慢函數

 

 

Socket通訊實際上就是網絡通訊,在通訊雙方兩頭都有socket,以包/流形式發送數據。this

 

 

 

 


 *簡單聊天程序:該案例是PC端和服務器進行通訊
 *發和收同時進行,須要用多線程線,一個線程控制發,一個線程控制收
public class  book16{
      public static void main(String[] args) throws SocketException  {
                        DatagramSocket  sendsocket=new DatagramSocket();
                        DatagramSocket  receivesocket=new DatagramSocket(1001);   //根據端口來接受
  
                        new Thread(new send(sendsocket)).start();
                        new Thread(new receive(receivesocket)).start();
      }
}
class send  implements Runnable{
       private DatagramSocket   ds;
       public send( DatagramSocket   ds){
             this.ds=ds;
       }
       public void run() {
            try{
                BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
               String s=null;
               while((s=br.readLine())!=null) {
                     if(s.equals("886")){
                           break;
                      }
                     byte[] b=s.getBytes();
                    //將數據封裝到包裏,除了數據外,還有IP,端口號                  
                    DatagramPacket  dp=new DatagramPacket(b, b.length,InetAddress.getByName("123.12.2.12"),1001);
                    ds.send(dp);
             }
          }
          catch (Exception e){
               throw new RuntimeException("發送失敗");
          }
  
      }
 
}
class receive  implements Runnable{  
         private DatagramSocket ds;
         public receive(DatagramSocket ds){
                this.ds=ds;
         }
        public void run()  {
            try  {
              while(true){
                 byte[] b=new byte[1024];
                 DatagramPacket dp=new DatagramPacket(b, b.length);
                 ds.receive(dp);  //阻塞式方法
                 int i=dp.getPort();
                 String s=dp.getAddress().getHostAddress();
                  System.out.println(i+"\n"+s);
               }
            } 
           catch (Exception e){
                throw new RuntimeException("接受失敗");
           }
       }
 
}線程

 

 

 

TCP的案例: 發送圖片到服務器
進程

 * 客戶端併發傳圖片

public class  book16{
  public static void main(String[] args)  {
    try {    

       //數組含有一個參數即圖片時,大小爲1
       if (args.length!=1){
             System.out.println("選擇一個jpg格式的圖片");
             return ;
       }
       File  f=new File(args[0]);   //根據主函數傳值來選定圖片
       if(!(f.exists()&&f.isFile())){
              System.out.println("文件不存在");
               return ;
       }
       if(!f.getName().endsWith(".jpg")){
              System.out.println("文件格式不對");
              return ;
       }
       
      Socket s=new Socket("123.123.2.123",1001);
      FileInputStream  fs=new FileInputStream(f);
      OutputStream os=s.getOutputStream();
      byte[] b=new byte[1024];
      int i=0;
      while((i=fs.read(b))!=-1) {
         os.write(b);
      }
      s.shutdownOutput();
      InputStream is=s.getInputStream();
      byte[] B=new byte[1024];
      int I=is.read(B);
      System.out.println(new String(B,0,I));
      fs.close();
      s.close();
    }
    catch (Exception e)
    {
   // TODO: handle exception
    }
  
   }
}


 //服務端同時接受多個客戶端,利用線程封裝
public class  book16{
   public static void main(String[] args)  {
        try  {
           ServerSocket ss=new ServerSocket(1001);
           while(true){
             Socket s=ss.accept();
              new Thread( new THREAD(s) ).start();
           }
       }
    catch (IOException e){
    }
   }
}

class THREAD implements Runnable{     private Socket s;     public THREAD(Socket s) {         this.s=s;     }     public void run() {            String ip=s.getInetAddress().getHostAddress();         int count=1;         try  {                System.out.println(ip+"連接");             InputStream is=s.getInputStream();             File f=new File(ip+"("+count+")"+".jpg");             while( f.exists() ){                     f=new File(ip+(count++)+".jpg");             }             FileOutputStream fs=new FileOutputStream(f);             byte[] b=new byte[1024];             int i=0;             while((i=is.read(b))!=-1){                   fs.write(b,0,i);             }            OutputStream os=s.getOutputStream();            os.write("上傳成功".getBytes());            is.close();           s.close();        }   catch (Exception e)  {    } } }

相關文章
相關標籤/搜索