Java學習筆記--網路程式設計Socket

左墾發表於2017-05-31

**今天學習了網路程式設計,主要用到Socket語句。
1.首先了解網路程式設計三要素
a.ip:一個計算機的標識,是一個網路之間互聯的協議(Internet Protocol),每個終端有且僅有一個ip地址。
b.埠:裝置與外界進行通訊的出口,用來進行通訊,分為物理埠和邏輯埠,這裡用到的埠是邏輯埠,
有效埠的範圍在0~65535之間,是應用程式在計算機內部對應的表示。
c.協議:計算機網路中用於交換資訊而規則,標準或約定的集合。這裡指TCP/UDP。
2.TCP/UDP協議
TCP協議:是一種面向連線的,可靠的基於位元組流的傳輸層通訊協議,需要建立連線,形成連線通道,
資料可以使用連線通道直接進行傳輸,無大小限制,效率比較低
UDP協議:User Datagrem Protocol,使用者資料包協議,一種無連線的傳輸層協議,和TCP協議相同用於處理資料包,
UDP有不提供資料包的分組,組裝,還有對資料包進行排序的缺點,所以我們無法確定資料包是否被安全
傳達。效率較TCP來說比較高,但是不安全。
3.學習中用到的Java類
InetAddress:IP地址描述類,為了方便我們對IP地址的獲取和操作,常見功能有:
public static InerAddress getByName(String host);通過主機名或IP地址得到InetAdress類
public String getHostAddress();返會ip地址字串
public String getHostName(); 返回ip地址主機名。

import java.net.InetAddress;
import java.net.UnknownHostException;
public class InetAddressDemo {
    public static void main(String[] args) throws Exception {
        InetAddress address = InetAddress.getByName("192.168.20.25");

        String hostName = address.getHostName();
        System.out.println(hostName);
    }
}

4.Socket程式設計(網路程式設計)
a.Socket套接字具有唯一標識的IP地址和埠號組合在一起才能構成唯一能識別的識別符號套接字。
b.Socket程式設計機制:
通訊雙方都有Socket。
網路通訊實際就是Socket間的通訊。
資料在兩個Socket之間進行IO傳輸。
c.UDP通訊
傳送步驟:建立UDP傳送資料端的Socket物件;建立資料包並給出資料,把資料打包;通過Socket物件傳送資料包;釋放資源。
接收步驟:建立UDP接收端的Socket物件;建立一個接收資料的資料包;接收資料,將資料放在接收的資料包中;解析資料包,並把資料顯示在控制檯上;釋放資源。

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;

public class UdpClient {
    public static void main(String[] args) throws Exception {
        //1.建立傳送端的socket物件
        DatagramSocket ds = new DatagramSocket();

        InetAddress address = InetAddress.getByName("192.168.20.25");
        int port = 9999;

        //2.建立鍵盤錄入物件
        Scanner sc = new Scanner(System.in);
        String line;
        while ((line=sc.nextLine())!=null) {
            //鍵盤錄入的資料line
            byte[] buf = line.getBytes();
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length, address, port);
            //傳送資料包
            ds.send(dp);
        }

        //釋放資源
        ds.close();
    }
}
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
    public static void main(String[] args) throws Exception {
        //建立接收端的socket物件
        DatagramSocket ds = new DatagramSocket(9999);

        //接受來自客戶端的資料
        while (true) {
            //建立資料包
            byte[] buf = new byte[1024];
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length);

            //接受來自客戶端的資料
            ds.receive(dp);

        //解析資料包中的資料
            byte[] data = dp.getData();
            int len = dp.getLength();
            System.out.println(new String(data, 0, len));
        }
    }
}

d.TCP通訊
傳送端:建立TCP底層傳輸資料Socket物件(指定伺服器ip及埠號),如Socket sk = new Socket(“196.168.25.25”,9999);獲取輸出流,並寫入資料,如OutputStream outputStream = sk.getOutputStream();
outputStream.write(“Hello”.getBytes());
釋放資源;
接收端:建立TCP協議接收端Socket物件(ServerSocket);監聽客戶端連線(Socket socket = new ServerSocket().accpet();獲取輸入流,並讀取資料,顯示在資料臺;釋放資源(socket.close())。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ServerThread implements Runnable{
    private Socket sk;
    public ServerThread(Socket sk){
        this.sk = sk;
    }
    @Override
    public void run() {
        try {
            BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream()));
            BufferedWriter bw = new BufferedWriter(new FileWriter(UUIDUtils.getFileName()));

            String line;
            while((line = br.readLine()) != null ){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.print````````
tackTrace();
        }
    }

}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;


/**
 * 2.6  
    需求:客戶端讀取文字檔案中的內容傳送給服務端,服務端將內容控制檯輸出
 *  客戶端:
 *  1.讀取文字檔案,一次讀取一行
 *  2.將讀取到的內容寫入通道,一次寫一行
 *  3.釋放資源
 *  伺服器端:   
 *  1.從通道中讀取資料,一次讀取一行
 *  2.輸出
 */
public class TcpClient {
    public static void main(String[] args) throws Exception {
        Socket sk = new Socket("192.168.20.25", 10010);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream()));
        BufferedReader br = new BufferedReader(new FileReader("a.txt"));

        String line;
        while((line = br.readLine()) != null ){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        br.close();
        bw.close();
        sk.close();
    }
}
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        ServerSocket ss = new ServerSocket(10010);
        while(true){
            Socket sk = ss.accept();
            new Thread(new ServerThread(sk)).start();
        }

    }
}
import java.util.UUID;

public class UUIDUtils {

    public static String getFileName(){
        String fileName = UUID.randomUUID().toString();
        fileName = fileName.replaceAll("-", "") + ".txt";
        return fileName;
    }
}

相關文章