TCP方式的傳輸

TCP

客戶端

先創建socket對象建立tcp客戶端,明確服務端的地址和端口,必須與服務端對應,要不然對方收不到消息,就像快遞填錯了送貨地址。

Socket s = new Socket("127.255.255.25", 10003);

然後建立起連接通道後就會出現socket的IO流,作爲客戶端我們是發送數據的,我們將數據發送到服務端讓它去處理,所以我們獲取的也就是OutPutStream,就是將數據寫給服務端

OutputStream out = s.getOutputStream();

然後剩下的就是給服務端寫數據了,這些操作其實就和IO流那塊一樣了,比如我們下面這樣

out.write("hello,TCP來了".getBytes());

最後一定記得關閉socket資源

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

public class TcpClient {
    public static void main(String[] args) throws IOException, IOException {

        System.out.println("客戶端運行。。。");
        /**
         *  需求:通過tcp傳輸數據發送給服務器
         *  思路:
         *      1、建立tcp客戶端socket.明確服務端的地址和端口
         *      2、如果通道建立成功就會出現socket io流
         *          客戶端需要做的就是獲取socket流中輸出流將數據發送目的地服務端
         *      3、通過socket輸出流將數據發送
         *      4、關閉
         */
        //1、建立tcp客戶端socket.明確服務端的地址和端口

        Socket s = new Socket("127.255.255.25", 10003);

        //2、如果通道建立成功就會出現socket io流      客戶端需要做的就是獲取socket流中輸出流將數據發送目的地服務端
        //3、通過socket輸出流將數據發送

        OutputStream out = s.getOutputStream();
        out.write("hello,TCP來了".getBytes());
        //4、關閉
        s.close();
    }
}

當你給服務端發送完數據後,有可能服務端還會給你回覆一些數據,這時候在客戶端還需要去接收服務端發送來的數據,只需要

InputStream in = s.getInputStream();

獲取讀取流,然後像IO流一樣操作就可以讀取返回的數據了

package tcp;

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


public class TCPClient2 {

    public static void main(String[] args) throws IOException{
        System.out.println("客戶端2   run...");
        /**
         *  案例二:實現客戶端和服務端的收發過程 
         */
        //創建客戶端socket對象,明確服務端地址和端口
        Socket s = new Socket("127.255.255.25",10009);
        
        //發送數據通過socket輸出流完成
        OutputStream out = s.getOutputStream();
        out.write("服務端,我來了".getBytes());
        
        //讀取服務器端返回的數據
        InputStream in = s.getInputStream();
        byte[] buf = new byte[1024];
        int len= in.read(buf);
        System.out.println(new String(buf,0,len));
//      int len = 0;
//      while((len = in.read(buf)) != -1)
//      {
//          System.out.println(new String(buf,0,len));
//      }
        
        
        //關閉資源
        s.close();
        
    }
}

服務端

服務端要與客戶端相連接,就必須創建一個服務端Serversocket對象,並明確端口,這個端口必須與客戶端socket連接的端口一致,然後用一個socket對象去接收客戶端的socket

 ServerSocket ss = new ServerSocket(10003);//創建服務端的socket。需要明確端口(監聽一個端口),要不然客戶端無法連接
 Socket s = ss.accept();//服務端只要獲取到連接過來的客戶端就可以和指定的客戶端通信了

這個接收客戶端的socket對象s裏面封裝了不光數據內容,還有數據來源的主機IP等等信息。
然後獲取流對象,對客戶端發送來的數據進行讀取

 InputStream in = s.getInputStream();

接下來就和IO操作一樣,對數據進行處理即可。

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

public class TcpServer {
    public static void main(String[] args) throws IOException {
        System.out.println("服務端。。。");
        /**
         *  需求:獲取客戶端的數據並顯示在屏幕上
         *
         *  思路:
         *      1、創建服務端的socket。需要明確端口(監聽一個端口),要不然客戶端無法連接
         *      2、服務端只要獲取到連接過來的客戶端就可以和指定的客戶端通信了
         *      3、通過獲取客戶端的讀取流對象讀取客戶端發來的數據
         *      33、並顯示在屏幕上
         *      5、關閉資源
         */

        //1、創建服務端的socket。需要明確端口(監聽一個端口),要不然客戶端無法連接

        ServerSocket ss = new ServerSocket(10003);

        //2、服務端只要獲取到連接過來的客戶端就可以和指定的客戶端通信了

        Socket s = ss.accept();
        String ip = s.getInetAddress().getHostAddress();
        System.out.println(ip+"...connected");
        //3、通過獲取客戶端的讀取流對象讀取客戶端發來的數據
        InputStream in = s.getInputStream();

        //33、並顯示在屏幕上
        byte[] buf = new byte[1024];
        int len = 0;
        while((len = in.read(buf)) != -1)
        {
            System.out.println(new String(buf, 0, len));
        }

        //5、關閉資源
        s.close();
        //ss.close();   這一般不關
    }
}

一般服務端接收到數據之後,它還會給客戶端返回一些反饋信息,我們可以繼續獲取讀寫流,對客戶端進行寫入操作,即反饋信息。

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

public class TcpServer2 {
    public static void main(String[] args) throws IOException {

        System.out.println("服務端2   run...");
        /**
         *  案例二:實現客戶端和服務端的收發過程 
         *  服務器端
         */
        
        //創建tcp服務端socket明確端口
        ServerSocket ss = new ServerSocket(10009);
        while(true)
        {
            //獲取客戶端對象
            Socket s = ss.accept();
            System.out.println(s.getInetAddress().getHostAddress()+"...connected");

            //讀取客戶端發送過來的數據
            InputStream in = s.getInputStream();
            byte[] buf = new byte[1024];
            int len = in.read(buf);         //讀取到數據之前,線程處於阻塞狀態
            System.out.println(new String(buf,0,len));
//          int len = 0;
//          while((len = in.read(buf)) != -1)
//          {
//              System.out.println(new String(buf,0,len));
//          }
//          
//          System.out.println("阻塞了嗎?");
            
            //給客戶端回饋數據
            OutputStream out = s.getOutputStream();
            out.write("客戶端。我已收到。哦耶!".getBytes());

            //關閉客戶端
            s.close();
        }
        
        //關閉服務端
        //ss.close();   如果是不斷的獲取客戶端,就不用關閉服務器
    }
}

結果演示:

先開啓服務端
在這裏插入圖片描述
服務端收到數據
在這裏插入圖片描述
客戶端收到反饋
在這裏插入圖片描述

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