<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] # TCP UDP中只有發送端和接收端,不區分客戶端與服務器端,計算機之間可以任意地發送數據。 而TCP通信是嚴格區分客戶端與服務器端的,在通信時,必須先由客戶端去連接服務器端才能實現通信,服務器端不可以主動連接客戶端,并且服務器端程序需要事先啟動,等待客戶端的連接。 在JDK中提供了兩個類用于實現TCP程序,一個是ServerSocket類,用于表示服務器端,一個是Socket類,用于表示客戶端。 ## ServerSocket 使用該構造方法在創建ServerSocket對象時,就可以將其綁定到一個指定的端口號上(參數port就是端口號)。 ~~~ 創建綁定到特定端口的服務器套接字 ServerSocket(int port) ~~~ ServerSocket的常用方法 ~~~ 偵聽并接受到此套接字的連接 Socket accept(); 返回此服務器套接字的本地地址 InetAddress getInetAddress() ~~~ ServerSocket對象負責監聽某臺計算機的某個端口號,在創建ServerSocket對象后,需要繼續調用該對象的accept()方法,接收來自客戶端的請求。當執行了accept()方法之后,服務器端程序會發生阻塞,直到客戶端發出連接請求,accept()方法才會返回一個Scoket對象用于和客戶端實現通信,程序才能繼續向下執行 ## Socket 用于實現TCP客戶端程序 **構造方法** 該構造方法在創建Socket對象時,會根據參數去連接在指定地址和端口上運行的服務器程序,其中參數host接收的是一個字符串類型的IP地址 ~~~ 創建一個流套接字并將其連接到指定主機上的指定端口號 Socket(String host, int port) ~~~ 參數address用于接收一個InetAddress類型的對象,該對象用于封裝一個IP地址。 ~~~ 創建一個流套接字并將其連接到指定主機上的指定端口號 Socket(InetAddress address, int port) ~~~ **常用方法** | 方法聲明 | 功能描述 | | --- | --- | | int getPort() | 該方法返回一個int類型對象,該對象是Socket對象與服務器端連接的端口號 | | InetAddress getLocalAddress() | 該方法用于獲取Socket對象綁定的本地IP地址,并將IP地址封裝成 InetAddress類型的對象返回 | | void close() | 該方法用于關閉Socket連接,結束本次通信。在關閉socket之前,應將與socket相關的所有的輸入/輸出流全部關閉,這是因為一個良好的程序應該在執行完畢時釋放所有的資源 | | InputStream getInputStream() | 該方法返回一個InputStream類型的輸入流對象,如果該對象是由服務器端的Socket返回,就用于讀取客戶端發送的數據,反之,用于讀取服務器端發送的數據 | | OutputStream getOutputStream() | 該方法返回一個OutputStream類型的輸出流對象,如果該對象是由服務器端的Socket返回,就用于向客戶端發送數據,反之,用于向服務器端發送數據 | 在Socket類的常用方法中,getInputStream()和getOutStream()方法分別用于獲取輸入流和輸出流。當客戶端和服務端建立連接后,數據是以IO流的形式進行交互的,從而實現通信。 接下來通過一張圖來描述服務器端和客戶端的數據傳輸,如下圖所示 ![](https://box.kancloud.cn/c346d213f2b884381f403d9eb4984572_916x315.png) ## TCP實現文件上傳 * 服務器端 ~~~ /* * 文件上傳 服務器端 * */ public class TCPServer { public static void main(String[] args) throws IOException { //1,創建服務器,等待客戶端連接 ServerSocket serverSocket = new ServerSocket(8888); Socket clientSocket = serverSocket.accept(); //顯示哪個客戶端Socket連接上了服務器 InetAddress ipObject = clientSocket.getInetAddress();//得到IP地址對象 String ip = ipObject.getHostAddress(); //得到IP地址字符串 System.out.println("小樣,抓到你了,連接我!!" + "IP:" + ip); //7,獲取Socket的輸入流 InputStream in = clientSocket.getInputStream(); //8,創建目的地的字節輸出流 D:\\upload\\192.168.74.58(1).jpg BufferedOutputStream fileOut = new BufferedOutputStream(new FileOutputStream("D:\\upload\\192.168.74.58(1).jpg")); //9,把Socket輸入流中的數據,寫入目的地的字節輸出流中 byte[] buffer = new byte[1024]; int len = -1; while((len = in.read(buffer)) != -1){ //寫入目的地的字節輸出流中 fileOut.write(buffer, 0, len); } //-----------------反饋信息--------------------- //10,獲取Socket的輸出流, 作用:寫反饋信息給客戶端 OutputStream out = clientSocket.getOutputStream(); //11,寫反饋信息給客戶端 out.write("圖片上傳成功".getBytes()); out.close(); fileOut.close(); in.close(); clientSocket.close(); //serverSocket.close(); } } ~~~ * 編寫客戶端,完成上傳圖片 ~~~ /* * 文件上傳 客戶端 * * public void shutdownOutput() 禁用此Socket的輸出流,間接的相當于告知了服務器數據寫入完畢 */ public class TCPClient { public static void main(String[] args) throws IOException { //2,創建客戶端Socket,連接服務器 Socket socket = new Socket("192.168.74.58", 8888); //3,獲取Socket流中的輸出流,功能:用來把數據寫到服務器 OutputStream out = socket.getOutputStream(); //4,創建字節輸入流,功能:用來讀取數據源(圖片)的字節 BufferedInputStream fileIn = new BufferedInputStream(new FileInputStream("D:\\NoDir\\test.jpg")); //5,把圖片數據寫到Socket的輸出流中(把數據傳給服務器) byte[] buffer = new byte[1024]; int len = -1; while ((len = fileIn.read(buffer)) != -1){ //把數據寫到Socket的輸出流中 out.write(buffer, 0, len); } //6,客戶端發送數據完畢,結束Socket輸出流的寫入操作,告知服務器端 socket.shutdownOutput(); //-----------------反饋信息--------------------- //12,獲取Socket的輸入流 作用: 讀反饋信息 InputStream in = socket.getInputStream(); //13,讀反饋信息 byte[] info = new byte[1024]; //把反饋信息存儲到info數組中,并記錄字節個數 int length = in.read(info); //顯示反饋結果 System.out.println( new String(info, 0, length) ); //關閉流 in.close(); fileIn.close(); out.close(); socket.close(); } } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看