Java中的TCP通信程序

TCP可以實現兩臺計算機之間的數據交互通信的兩端躬它,要嚴格區(qū)分客戶端與服務端
兩端通信時的步驟:
1.服務端程序筒狠,需要事先啟動挺庞,等待客戶端連接
2.客戶端主動連接服務器端讼稚,才能成功通信,服務器端不可以主動鏈接客戶端

在java中兩個類用于實現TCP通信程序:

  1. 客戶端: java.net.Socket 類表示茧痒。創(chuàng)建 Socket 對象肮韧,向服務端發(fā)出連接請求,服務端響應請求,兩者建 立連接開始通信惹苗。
  2. 服務端: java.net.ServerSocket 類表示殿较。創(chuàng)建 ServerSocket 對象,相當于開啟一個服務桩蓉,并等待客戶端 的連接淋纲。

Socket類

socket類:該類實現客戶端套接字,套接字是指兩臺設備之間的端點

構造方法:
public Socket(String host院究,int port):創(chuàng)建套接字對象并將其連接到指定對象的主機上洽瞬,如果指定的host為NULL,則相當于指定的地址為回送地址
回送地址
回送地址(127.x.x.x) 是本機回送地址(Loopback Address)业汰,主要用于網絡軟件測試以及本 地機進程間通信伙窃,無論什么程序,一旦使用回送地址發(fā)送數據样漆,立即返回为障,不進行任何網絡傳輸。
構造舉例

Socket client=new Socket(“127.0.0.1”放祟,666)

成員方法:
public InputStream getInputStream() : 返回此套接字的輸入流鳍怨。 如果此Scoket具有相關聯的通道,則生成的InputStream 的所有操作也關聯該通道跪妥。 關閉生成的InputStream也將關閉相關的Socket鞋喇。

public OutputStream getOutputStream() : 返回此套接字的輸出流。 如果此Scoket具有相關聯的通道眉撵,則生成的OutputStream 的所有操作也關聯該通道侦香。 關閉生成的OutputStream也將關閉相關的Socket

public void close() :關閉此套接字。 一旦一個socket被關閉纽疟,它不可再使用罐韩。 關閉此socket也將關閉相關的InputStream和OutputStream 。
public void shutdownOutput() : 禁用此套接字的輸出流仰挣。 任何先前寫出的數據將被發(fā)送伴逸,隨后終止輸出流缠沈。

ServerSocket類

public ServerSocket(int port) :使用該構造方法在創(chuàng)建ServerSocket對象時膘壶,就可以將其綁定到一個指 定的端口號上,參數port就是端口號
構造舉例代碼如下:

ServerSocket server=new ServerSocket(666)

成員方法 public Socket accept() :偵聽并接受連接洲愤,返回一個新的Socket對象颓芭,用于和客戶端實現通信。
兩個需要明確的事情
1多個服務器端與客戶進行交互柬赐,服務器必須明確是和哪個客戶端進行交互亡问,這個accept()方法用與獲取請求的客戶端對象
2.多個客戶端同時與服務器進行交互就需要使用多個io流對象
服務器是沒有io流的,服務器可以獲取到請求的客戶端對象的scoket,使用每一個客戶端Socket中提供的io流對象進行交互州藕。
服務器端使用客戶端的字節(jié)輸入流讀取客戶端發(fā)送的數據束世,
服務器端使用客戶端的字節(jié)輸出流給客戶端回寫數據
即服務器端使用客戶端流與客戶端交互
好比生活中的我請客你買單


在這里插入圖片描述

簡單的TCP網絡程序圖解

  1. 【服務端】啟動,創(chuàng)建ServerSocket對象,等待連接毁涉。 Socket client = new Socket("127.0.0.1", 6666); ServerSocket server = new ServerSocket(6666);
  2. 【客戶端】啟動,創(chuàng)建Socket對象,請求連接锈死。
  3. 【服務端】接收連接,調用accept方法,并返回一個Socket對象
  4. 【客戶端】Socket對象待牵,獲取OutputStream其屏,向服務端寫出數據
  5. 【服務端】Scoket對象缨该,獲取InputStream,讀取客戶端發(fā)送的數據贰拿。
  6. 【服務端】Socket對象,獲取OutputStream壮不,向客戶端回寫數據汗盘。
  7. 【客戶端】Scoket對象,獲取InputStream询一,解析回寫數據
  8. 【客戶端】釋放資源隐孽,斷開連接。
在這里插入圖片描述

該方法 會一直阻塞直到建立連接健蕊。

下面寫一段簡單的客戶端與服務器端交互的代碼
服務器端代碼

package Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
    public static void main(String[] args) throws IOException {
        System.out.println("服務器啟動等待連接:");
        //創(chuàng)建服務器端對象
        ServerSocket serverSocket = new ServerSocket(8888);
        //使用accept方法接受socket對象
        Socket accept = serverSocket.accept();
        //通過socket獲取輸入流
        InputStream inputStream = accept.getInputStream();
        //會不會阻塞
        System.out.println("XXXXXXXXXXXXXXXXX");
        byte[] bytes = new byte[1024];
        int read = inputStream.read(bytes);
        //通過字節(jié)數組生成字符串
        String s = new String(bytes,0,read);
        //輸出
        System.out.println(s);
        //向客戶端返回信息
        OutputStream outputStream = accept.getOutputStream();
        //返回內容
        outputStream.write("內容已經收到".getBytes());
        //關閉資源
        inputStream.close();
        serverSocket.close();
    }
}

客戶端代碼

package Socket;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
public class Client {
    public static void main(String[] args) throws IOException {
        //創(chuàng)建Socket對象
        Socket socket = new Socket("127.0.0.1", 8888);
        //獲取輸出流
        OutputStream outputStream = socket.getOutputStream();
        //給服務端發(fā)送消息
        outputStream.write("你好".getBytes());
        //創(chuàng)建輸入流對象
        InputStream inputStream = socket.getInputStream();
        //創(chuàng)建讀取的數組
        byte[] bytes = new byte[1024];
        //獲取字節(jié)數組的長度
        int read = inputStream.read(bytes);
        //輸出結果
        System.out.println(new String(bytes,0,read));
        //關閉流
        outputStream.close();
        //關閉Socket對象
        socket.close();
    }
}

結果
服務器端

在這里插入圖片描述

客戶端


在這里插入圖片描述

以上就是Java中的TCP通信程序的一些基本操作菱阵,

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市缩功,隨后出現的幾起案子晴及,更是在濱河造成了極大的恐慌,老刑警劉巖嫡锌,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑稼,死亡現場離奇詭異,居然都是意外死亡势木,警方通過查閱死者的電腦和手機蛛倦,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來啦桌,“玉大人溯壶,你說我怎么就攤上這事。” “怎么了且改?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵验烧,是天一觀的道長。 經常有香客問我又跛,道長噪窘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任效扫,我火速辦了婚禮倔监,結果婚禮上,老公的妹妹穿的比我還像新娘菌仁。我一直安慰自己浩习,他們只是感情好,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布济丘。 她就那樣靜靜地躺著谱秽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摹迷。 梳的紋絲不亂的頭發(fā)上疟赊,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機與錄音峡碉,去河邊找鬼近哟。 笑死,一個胖子當著我的面吹牛鲫寄,可吹牛的內容都是我干的吉执。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼地来,長吁一口氣:“原來是場噩夢啊……” “哼戳玫!你這毒婦竟也來了?” 一聲冷哼從身側響起未斑,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜡秽,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體载城,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了睬澡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡斗躏,死狀恐怖,靈堂內的尸體忽然破棺而出啄糙,到底是詐尸還是另有隱情云稚,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布燕雁,位于F島的核電站,受9級特大地震影響拐格,放射性物質發(fā)生泄漏。R本人自食惡果不足惜捏浊,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一呛伴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧热康,春花似錦、人聲如沸姐军。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽村生。三九已至,卻和暖如春趁桃,著一層夾襖步出監(jiān)牢的瞬間肄鸽,已是汗流浹背油啤。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工益咬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人幽告。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像齐唆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝶念,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355