java TCP傳輸


 

兩個端點的建立連接后會有一個傳輸數據的通道,這通道稱為流,而且是建立在網絡基礎上的流,稱之為socket流。該流中既有讀取,也有寫入。

 

tcp的兩個端點:一個是客戶端,一個是服務端。

客戶端:對應的對象,Socket

服務端:對應的對象,ServerSocket

 

TCP客戶端:

①:建立tcp的socket服務,最好明確具體的地址和端口。這個對象在創建時,就已經可以對指定ip和端口進行連接(三次握手)

②:如果連接成功,就意味着通道建立了,socket流就已經產生了。只要獲取到socket流中的讀取流和寫入流即可,只要通過getInputStream和getOutputStream就可以獲取兩個流對象。

③:關閉資源。

 

 

import java.net.*;

import java.io.*;

//需求:客戶端給服務器端發送一個數據。

class  TcpClient{

        public static void main(String[] args) throws Exception{

                Socket s = new Socket("10.1.31.69",10002);

                OutputStream out = s.getOutputStream();//獲取了socket流中的輸出流對象。

                out.write("tcp演示,哥們又來了!".getBytes());

                s.close();

}

}

 

TCP服務端:

①:創建服務端socket服務,並監聽一個端口。

②:服務端為了給客戶端提供服務,獲取客戶端的內容,可以通過accept方法獲取連接過來的客戶端對象。

③:可以通過獲取到的socket對象中的socket流和具體的客戶端進行通訊。

④:如果通訊結束,關閉資源。注意:要先關客戶端,再關服務端。

 

我的總結:對於UDP和TCP,既可以定義輸出流也可以創建輸入流,具體情況根據需要構建;比如:我們需要客戶端給服務器端發送數據,服務器端再給客戶端反饋數據;那么就要在客戶端和服務器端分別多加一個輸入流和輸出流!否則,發不出去,收不到!

 

class  TcpServer{

        public static void main(String[] args) throws Exception{

                ServerSocket ss = new ServerSocket(10002);//建立服務端的socket服務

                Socket s = ss.accept();//獲取客戶端對象

                String ip = s.getInetAddress().getHostAddress();

                System.out.println(ip+".....connected");//打印下作為連接上的標志

 

                // 可以通過獲取到的socket對象中的socket流和具體的客戶端進行通訊。

                InputStream in = s.getInputStream();//讀取客戶端的數據,使用客戶端對象的socket讀取流

                byte[] buf = new byte[1024];

                int len = in.read(buf);

                String text = new String(buf,0,len);

                System.out.println(text);

                // 如果通訊結束,關閉資源。注意:要先關客戶端,在關服務端。

                s.close();

                ss.close();

        }

}

 

備注:這個例子只是單方面的輸入!

 

Eg:雙向對話

 

客戶端:

package july76net;

//TCP雙向對話

 

import java.io.InputStream;

import java.io.OutputStream;

import java.net.Socket;

 

public class Demo10 {

    public static void main(String[] args) throws Exception {

        Socket s = new Socket("localhost",10036);

       

        OutputStream out = s.getOutputStream();

       

        out.write("你好,服務器!我是劉昭!".getBytes());

        s.shutdownOutput();//注意!!!關閉標簽

        InputStream is = s.getInputStream();

        byte []buf = new byte[1024];

        int len = is.read(buf);

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

        s.close();

    }

}

 

服務器端

 

package july76net;

//TCP雙向輸入輸出

 

import java.io.InputStream;

import java.io.OutputStream;

import java.net.ServerSocket;

import java.net.Socket;

 

public class Demo11 {

    public static void main(String[] args) throws Exception {

        ServerSocket ss = new ServerSocket(10036);

        Socket s = ss.accept();

       

        String ip = s.getInetAddress().getHostAddress();

        System.out.println(ip+"..........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;

        while((len = in.read(buf)) != -1){

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

        }

        OutputStream os = s.getOutputStream();

       

        os.write("劉昭你好!我是服務器!".getBytes());

       

        s.close();

        ss.close();

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM