1. 程式人生 > >【Java學習筆記】23.網路程式設計--Socket

【Java學習筆記】23.網路程式設計--Socket

一.Java網路程式設計
網路程式設計又稱為Socket程式設計,或者套接字。
Socket包括:
1)ip:一個計算的標示(找到這個計算機)
2)埠號:應用程式都會對應一個埠,用來進行通訊,有效埠:0~65535,其中0~1024系統使用或保留埠
3)協議:有2種協議(TCP,UDP)

  • **TCP:**TCP 是傳輸控制協議的縮寫,它保障了兩個應用程式之間的可靠通訊。通常用於網際網路協議,被稱 TCP / IP
  • **UDP:**UDP 是使用者資料報協議的縮寫,一個無連線的協議。提供了應用程式之間要傳送的資料的資料包。

兩種協議的區別?
UDP:
把資料打成一個數據包 , 不需要建立連線
資料包的大小有限制不能超過64k
因為無連線,所以屬於不可靠協議(可能丟失資料)
因為無連線 ,所以效率高
TCP:


需要建立連線,形成連線通道
資料可以使用連線通道直接進行傳輸,無大小限制
因為有連結,所以屬於可靠協議
因為有連結,所以效率低

二.InetAddress–地址描述類

import java.net.InetAddress;
import java.net.UnknownHostException;

/*
 *  InetAddress:IP地址的描述類
 * 
    A:InetAddress類的概述
        為了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用
        此類表示網際網路協議 (IP) 地址。 
    B:InetAddress類的常見功能
        public static InetAddress getByName(String host)( host: 可以是主機名,也可以是IP地址的字串表現形式)
        public String getHostAddress()返回 IP 地址字串(以文字表現形式)。
        public String getHostName()獲取此 IP 地址的主機名。 
    C:案例演示: InetAddress類的常見功能
 */
public class InetAddressDemo { public static void main(String[] args) throws Exception { //通過主機ip獲取InetAddress物件 //127.0.0.1是本地迴環地址,指向本機地址 InetAddress address = InetAddress.getByName("127.0.0.1"); //public String getHostAddress()返回 IP 地址字串(以文字表現形式)。 System.out.println(address.getHostAddress()); //public String getHostName()獲取此 IP 地址的主機名。
System.out.println(address.getHostName()); } }

三.Socket程式設計
1.UDP協議的客戶端/服務端的通訊
客戶端實現:UdpCliebt.java

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

/**
 * UDP協議特點:
 * 1.資料通過打包之後進行傳送
 * 2.不需要進行連線
 * 3.資料大小有限制
 * 4.協議屬於不安全協議
 * 5.效率比較高
 */
public class UdpClient {
    public static void main(String[] args) throws Exception {
        //1.建立udp協議傳送端的socket物件
        //public DatagramSocket() throws SocketException
        DatagramSocket ds = new DatagramSocket();

        byte[] buf = "hello".getBytes();
        int length = buf.length;
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 8888;

        //2.建立資料包
        //public DatagramPacket(byte[] buf, int length,InetAddress address,int port)
        DatagramPacket dp = new DatagramPacket(buf, length, address, port);
        /**
         * 1.你要傳送的資料
         * 2.傳送的資料的長度
         * 3.你要傳送給的電腦ip
         * 4.埠
         */

        //傳送資料
        ds.send(dp);

        //釋放資源
        ds.close();


    }

}

服務端實現:UdpServer.java

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(8888);

        //建立一個數據包,用來接收來自發送端的資料,是一個空的資料包
        byte[] buf = new byte[1024];
        int length = buf.length;
        DatagramPacket dp = new DatagramPacket(buf, length);

        //接受來自發送端的資料
        //public void receive(DatagramPacket p)throws IOException
        //程式在這裡接收到來自發送端的資料之前一直處於阻塞狀態
        ds.receive(dp);

        //解析一下資料包中的資料
        //public byte[] getData()返回資料緩衝區
        byte[] data = dp.getData();
        //public int getLength()返回將要傳送或接收到的資料的長度
        int len = dp.getLength();

        System.out.println(new String(data,0,len));

        //釋放資源
        ds.close();

    }

}

注意:應先啟動伺服器端,再啟動客戶端傳送資料

2.TCP協議的客戶端/服務端的通訊
客戶端:TcpClient.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class TcpClient {
    public static void main(String[] args) throws Exception {
        //建立tcp傳送端的sockt物件
        Socket sk = new Socket("127.0.0.1", 10000);

        //從通道中獲取輸出流
        OutputStream os = sk.getOutputStream();

        //網通道中寫資料
        os.write("今晚約嗎".getBytes());

        //接受來自伺服器端的反饋
        InputStream is = sk.getInputStream();
        //解析is
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf, 0, len));

        //釋放資源
        sk.close();

    }

}

伺服器端:TcpServer.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpServer {
    public static void main(String[] args) throws Exception {
        //建立伺服器端的socket物件
        ServerSocket ss = new ServerSocket(10000);

        //監聽來自客戶端的連線
        Socket sk = ss.accept();

        //從通道中獲取輸入流讀取資料
        InputStream is = sk.getInputStream();

        //解析is
        byte[] buf = new byte[1024];
        int len = is.read(buf);
        System.out.println(new String(buf, 0, len));


        //給客戶端一個反饋
        OutputStream os = sk.getOutputStream();
        os.write("不約".getBytes());


        //釋放資源
        sk.close();


    }

}

相關推薦

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

一.Java網路程式設計 網路程式設計又稱為Socket程式設計,或者套接字。 Socket包括: 1)ip:一個計算的標示(找到這個計算機) 2)埠號:應用程式都會對應一個埠,用來進行通訊,有

Java學習筆記程式碼塊執行順序 2-8程式設計練習

Android零基礎入門——慕課就業班 Java面向物件——Java封裝 2-8程式設計練習 題目: 請根據效果圖以及任務要求完成程式碼。 程式參考執行效果圖如下: 任務要求: 建立類Code,類中編寫構造塊、靜態程式碼塊以及構造方法 建立C

Java學習筆記Java封裝 3-8程式設計練習

Android零基礎入門——慕課就業班 Java面向物件——Java封裝 2-8程式設計練習 3-8 作業 題目要求:       某公司要開發內部的 “辦公資訊化管理系統”,請使用面向物件的思想描述以下員工資訊。       程式執行參考效果圖如下: 任

JAVAWEB學習筆記23

clear 定時 tab 都沒有 cal subject 優化 select 再次 監聽器Listener 學習目標 案例-使用監聽器完成定時生日祝福 一、監聽器Listener javaEE包括13門規範 在課程中主要學習 servlet技術

java學習筆記單例模式

單例設計模式:某個類在整個系統中只能有一個例項物件可被獲取和使用的程式碼模式。例如:代表JVM執行環境的Runtime類 要點: 一.一個類只能有一個例項:構造器私有化 二.該類必須自己建立這個例項:含有一個該類的靜態變數來儲存這個唯一例項 三.該類必須向整個系統提供這個例項:方式:1.直接暴露2.用

java學習筆記模擬鬥地主功能

模擬鬥地主的功能:1.組合牌 2.洗牌 3.發牌 4.看牌,目的是溫習回顧一下java集合框架的應用。 import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; public class Po

java學習筆記MyBatis中當實體類中的屬性名和表中的欄位名不一樣時的解決方法

在使用MyBatis開發DAO層時,當實體類中的屬性名和表中的欄位名不一樣時,查詢出來的值為null,此時有3種解決方法 解決方法1                在Mapper.xml對映檔案中,寫SQL語句時起別名 解決

java學習筆記淺析JavaWeb開發中Model1模式和Model2模式

Model1模式   JavaBean就是java類,JavaBean分兩類:一類是實體Bean,一類是業務Bean model1模式優點:執行效率高,開發效率比較高,適合小型專案 model1模式缺點:邏輯比較混亂,頁面混亂,維護困難,擴充套件不容易   Model2模式

java學習筆記踩坑記錄,異常:javax.el.PropertyNotFoundException: Property [XXX] not found on type [XXX.XXX.XXX.XXX]

練習JavaWeb專案時,報錯javax.el.PropertyNotFoundException,原因是EL表示式裡面的屬性和pojo裡面的屬性名字沒有對上,範了個低階錯誤。 jsp中: <li>歡迎您,${loginUser.username}!</li> pojo

Java學習筆記吸血鬼數

吸血鬼數字,是指數位為偶數的數字,可以由一對數字相乘而得到,而這對數字各包含 乘積的一半位數的數字,其中從最初的數字中選取的數字可以任意排序。 以兩個0結尾的數字是不允許的,例如,下列數字都是'吸血鬼'數字 1260 = 21 * 60 1827 = 21 * 87 2187 = 27 * 81

Java學習筆記65:認識Filter(過濾器),FilterChain(過濾鏈)及其實現

Filter和Servlet、Listener一同作為Java web開發的三大元件。runoob中將Filter歸為Servlet,實際上Filter元件和Servlet元件是兩回事,但Filter介面等確實是在javax.servlet.*中,大概可以認為它

Java學習筆記靜態巢狀類和內部類

public class Outer { int outer_x = 100;     class Inner{       public int y = 10;       private int z = 9;       int m = 5;       publ

java學習筆記JAVA自學之路 JAVA自學之路 ___轉知乎

一:J2SE 面向物件-封裝、繼承、多型 記憶體的分析   遞迴 集合類、泛型、自動打包與解包、Annotation   IO 多執行緒、執行緒同步      TCP/UDP AWT、事件模型、匿名類      正則表示式 反射機制 二:資料庫(Oracle或者MySQL) SQL語句 多表連線,內外連線

Java學習筆記45:優先順序佇列PriorityQueue和比較器Comparator

模擬程序排程時的優先數法和簡單時間片輪轉法,前者可以為程序設定以優先數PRIORITY為優先順序,為了更好地併發,每次獲得處理機後優先數減少3而重新選取。 在簡單輪轉法中則僅僅是一個普通佇列,按照FIFO的方式出隊獲得處理機。 如果要使用比較器Compara

Java學習筆記<集合框架>對字串進行長度排序

1 import java.util.Iterator; 2 import java.util.TreeSet; 3 4 public class TreeSetTest { 5 6 public static void main(String[] args) { 7

Java學習筆記54:CentOS下安裝MySQL的JDBC驅動並嘗試連線

準備工作 開啟MySQL服務 [root@hostlzh lzh]# mysqld_safe & [1] 21768 [root@hostlzh lzh]# 180209 12:55:11 mysqld_safe Logging to '/var

Matlab學習筆記matlab的程式設計規則

1.Matlab的續行符:     關於matab的換行,在matlab程式碼的編寫過程中,有時會遇到程式碼在一行顯示不開了,或者在txt文件、或其他程式碼編輯後,由於其本身格式的作用,程式碼可能會自

Java學習筆記14.集合框架和泛型

1.Java中的集合框架體系 1.集合框架體系圖如圖所示: 2.Conllection介面: Collection 是最基本的集合介面,一個 Collection 代表一組 Object,Ja

JAVA學習筆記(六十)- 網路程式設計登入例項

客戶端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ja

Java學習筆記66:認識Java中的Reflection(反射)機制,獲取類的屬性和方法

反射部分一直欠著,現在學框架和Servlet必須要學一下了。最近學習Struts2框架和Servlet時候,很多地方直接給出類名就可以去使用了,如在web.xml中配置Filter時: <filter> <filter-name&