網絡編程

實現計算機互聯的三要素:
    1、IP地址
       本機迴路IP:127.0.0.1
    2、端口號(邏輯端口):用於標識應用程序。
       端口號0~65535之間的整數;0~1024之間大部分已被用於一些知名的網絡服務和應用,所以現在開發的網絡應用程序端口號一般是1024以後的整數。
    3、通信協議
       TCP:三次握手機制,面向連接,稍慢。可靠
        UDP:無連接,每個數據報大小限制在64K內。傳輸快。不可靠。



       TCP/IP參考模型:

       

     
     網絡編程:其實就是Socket編程
     通信的兩端都有Socket, 數據在兩個Socket間通過IO傳輸。
      UDP傳輸:DatagramSocket和DatagramPacket

  
      UDP通信示例:
     

class UDPsend {  
    public static void main(String[] args) throws Exception {  
        //創建UDP socket端點,可以指定固定端口發送數據,不指定則系統隨機產生  
        DatagramSocket ds = new DatagramSocket();  
        //確定數據,並封裝成數據包  
        byte[] buf = "Hello, java".getBytes();  
        DatagramPacket dp = new DatagramPacket(buf, 0, buf.length, InetAddress.getByName("127.0.0.1"), 8888);  
          
        //通過UDP socket的sent方法發送數據  
        ds.send(dp);  
        System.out.println("發送成功");  
    }  
}  
  
class UDPreceive {  
    public static void main(String[] args) throws Exception {  
        //創建UDP socket端點,指定用於接收數據的端口  
        DatagramSocket ds = new DatagramSocket(8888);  
        //定義數據包用於接收數據  
        byte[] buf = new byte[1024];  
        DatagramPacket dp = new DatagramPacket(buf, 0, buf.length);  
        //接收數據存入於數據包中  
        ds.receive(dp);  
          
        String ip = dp.getAddress().getHostAddress();  
        String data = new String(dp.getData(), 0, dp.getLength());  
        int port = dp.getPort();  
        System.out.println(ip + ", " + port + ", " + data);  
          
        ds.close();  
    }  
}  

      實例:用TCP完成一個英文文本大小寫轉換的客戶端和服務器端
      客戶端發送一個英文字符串到服務端,服務端返回一個將字符串轉爲全大寫後的信息到客戶端
      

import java.net.*;  
import java.io.*;  
/* 
 * 建立一個文本轉換器 
 *  
 * 分析:操作的是客戶端發來的文本信息數據,所以要用到IO流技術。 
 *  
 * 步驟: 
 * 1、建立服務 
 * 2、獲取鍵盤錄入 
 * 3、將數據發給服務端 
 * 4、服務端將小寫字母全部轉換爲大寫後發送給客戶端 
 * 5、關閉資源 
 * */  
public class TCPTextCast {  
  
    public static void main(String[] args) {  
  
    }  
  
}  
class TCPClient1 {  
      
    public static void main(String[] args) throws Exception {  
        Socket s = new Socket("127.0.0.1", 10003);  
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
          
        BufferedWriter bufOut = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));  
        //優化:PrintWriter out =new PrintWriter(s.getOutputStream(), true);  
        //將bufOut傳入PrintWriter(bufOut)也行  
        BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream()));  
          
        String line = null;  
        while((line=br.readLine())!= null) {  
            if("over".equals(line))  
                break;  
            bufOut.write(line);  
            bufOut.newLine();  
            bufOut.flush();  
            //三句變一句,用out.println(line);  
              
            System.out.println("Server: " + bufIn.readLine());  
        }  
          
        br.close();  
        s.close();  
    }  
      
}  
     

       TCP實例: 

       

/* 
 * 使用TCP協議寫一個可以上傳文件的服務器和客戶端。 
 *  
 * 思路:網絡編程與IO流相拼命 
 * 客戶端通過socket向其輸出流中寫入本地文件,用到FileInputStream讀取文件,也可加上緩衝BufferedInputStream. 
 *  還有通過socket的輸入流讀取服務器端的反饋信息。 
 * 服務端通過socket從其輸入流中讀取文件,存入到服務器端,並返回文件複製情況信息  
 * 資源關閉 
 * */  
  
import java.net.*;  
import java.io.*;  
public class FileLoader {  
  
    public static void main(String[] args) {  
  
    }  
  
}  
  
//客戶端  
class client {  
    public static void main(String[] args) throws Exception {  
        //建立Socket服務  
        Socket fileLoaderSocket = new Socket("127.0.0.1", 10005);  
        //從客戶端本地讀取文件,並寫入socket的輸出流中  
        OutputStream out = fileLoaderSocket.getOutputStream();  
        InputStream fileRead = new FileInputStream("G:\\Demo.mp3");  
          
        byte[] buf = new byte[1024];  
        int len = 0;  
        while((len=fileRead.read(buf)) != -1) {  
            out.write(buf, 0, len);  
        }  
        //告訴服務端,文件已傳輸完畢  
        fileLoaderSocket.shutdownOutput();  
          
        //獲取從服務端反饋的信息  
        BufferedReader in = new BufferedReader(new InputStreamReader(fileLoaderSocket.getInputStream()));  
        String serverBack = in.readLine();  
        System.out.println(serverBack);  
          
        //資源關閉  
        fileLoaderSocket.close();  
        fileRead.close();  
    }  
}  
  
//服務端  
class Server {  
    public static void main(String[] args) throws Exception {  
        //建立服務端Socket  
        ServerSocket ss = new ServerSocket(10005);  
        //接收客戶端Socket  
        Socket fileLoaderSocket = ss.accept();  
          
        //打印連接信息  
        String ip = fileLoaderSocket.getInetAddress().getHostAddress();  
        System.out.println(ip + "...conncected");  
          
        //接收文件,並保存  
        InputStream in = fileLoaderSocket.getInputStream();  
        OutputStream fileSave = new FileOutputStream("E:\\server.mp3");  
        byte[] buf = new byte[1024];  
        int len = 0;  
        while((len=in.read(buf)) != -1) {  
            fileSave.write(buf, 0, len);  
            fileSave.flush();  
        }  
        //返回文件複製情況信息  
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(fileLoaderSocket.getOutputStream()));  
        out.write("文件上傳成功");  
        out.flush();  
          
        //資源關閉  
        ss.close();  
        fileLoaderSocket.close();  
        fileSave.close();  
    }  
}  
class TCPServer1 {  
      
    public static void main(String[] args) throws Exception {  
        ServerSocket ss = new ServerSocket(10003);  
        Socket s = ss.accept();  
          
        String ip = s.getInetAddress().getHostAddress();  
        System.out.println(ip + "...connceted");  
          
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));  
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));  
          
        String data = null;  
        while((data=br.readLine()) != null) {  
              
            System.out.println(ip + "... : " + data);  
              
            bw.write(data.toUpperCase());  
            bw.newLine();  
            bw.flush();  
        }  
              
        s.close();  
        ss.close();  
    }  
      
}  

    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章