Java—— TCP协议(相关代码实现以及相关优化)
生活随笔
收集整理的這篇文章主要介紹了
Java—— TCP协议(相关代码实现以及相关优化)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
代碼運行的時候先運行服務端,然后在運行客戶端
* TCP協(xié)議:* 1,客戶端* 創(chuàng)建Socket連接服務器(指定IP地址,端口號)通過IP地址找到對應的服務器* 調(diào)用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連的IO流* 輸入流可以讀取服務器端輸出流寫出的數(shù)據(jù)* 輸出流可以寫出數(shù)據(jù)到服務端的輸入流* * 2,服務端* 創(chuàng)建ServerSocket(需要指定端口號)* 調(diào)用ServerSocket的accept()方法接受一個客戶端請求,得到一個Socket* 調(diào)用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流* 輸入流可以讀取客戶端輸出流寫出的數(shù)據(jù)* 輸出流可以寫出數(shù)據(jù)到客戶端的輸入流 package com.wsq.tcp; //java com.wsq.tcp.Demo1_Client import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException;public class Demo1_Client { /*** 1,客戶端* 創(chuàng)建Socket連接服務器(指定IP地址,端口號不超過65535)通過IP地址找到對應的服務器* 調(diào)用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連的IO流* 輸入流可以讀取服務器端輸出流寫出的數(shù)據(jù)* 輸出流可以寫出數(shù)據(jù)到服務端的輸入流* @throws IOException * @throws UnknownHostException * * * */public static void main(String[] args) throws UnknownHostException, IOException {Socket wsq = new Socket("192.168.1.182",1014); //創(chuàng)建Socket集裝箱對象wsq,并且指定想要發(fā)送他人的IP,和對應的端口號,連接服務器InputStream is = wsq.getInputStream(); //獲取客戶端輸入流OutputStream os = wsq.getOutputStream(); //獲取客戶端輸入流 byte [] arr = new byte [1024]; //創(chuàng)建字節(jié)數(shù)組用于讀取服務器發(fā)來的數(shù)據(jù)int len = is.read(arr); //讀取服務器發(fā)過來的數(shù)據(jù)System.out.println(new String (arr,0,len)); //將數(shù)據(jù)轉換成字符串打印os.write("客戶端對服務端發(fā)送請求:傻孩紙,還在睡呢?".getBytes());//客戶端向服務器寫數(shù)據(jù)wsq.close(); //關閉集裝箱對象wsq} } package com.wsq.tcp; //java com.wsq.tcp.Demo2_Server import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket;public class Demo2_Server { /*** * 2,服務端* 創(chuàng)建ServerSocket(需要指定端口號)* 調(diào)用ServerSocket的accept()方法接受一個客戶端請求,得到一個Socket* 調(diào)用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流* 輸入流可以讀取客戶端輸出流寫出的數(shù)據(jù)* 輸出流可以寫出數(shù)據(jù)到客戶端的輸入流* @throws IOException * * */public static void main(String[] args) throws IOException {ServerSocket server = new ServerSocket(1014); //創(chuàng)建ServerSocket并且指定端口號 Socket wsq= server.accept(); //接收客戶端的請求,創(chuàng)建集裝箱對象wsq,調(diào)用accept方法來接收客戶端向服務端發(fā)出的請求InputStream is = wsq.getInputStream(); //獲取客戶端輸入流OutputStream os = wsq.getOutputStream(); //獲取客戶端輸入流 os.write("服務端響應客戶端沒,剛睡醒,不想理你".getBytes());//服務端想客戶寫出數(shù)據(jù)byte [] arr = new byte [1024]; //創(chuàng)建字節(jié)數(shù)組用于接收服務器發(fā)來的數(shù)據(jù)int len = is.read(arr); //讀取服務器發(fā)過來的數(shù)據(jù)System.out.println(new String (arr,0,len)); //將數(shù)據(jù)轉換成字符串打印wsq.close(); //關閉socket集裝箱} }由上面的例子可以看出,該程序有點弊端,例如:讀寫的時候特別費勁,寫的時候得把字符串轉成字節(jié)數(shù)組給寫出去,讀取的時候,需要創(chuàng)建一個字節(jié)數(shù)組,然后才能讀進來,然后再轉換成字符串
優(yōu)化:讀的時候是字符串,寫的時候也是字符串,這樣會簡便很多
優(yōu)化代碼如下:
package www.wsq.TCP; import java.io.BufferedReader; //java com.wsq.tcp.Demo1_Client import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Socket; import java.net.UnknownHostException;public class Demo1_Client { /*** 1,客戶端* 創(chuàng)建Socket連接服務器(指定IP地址,端口號不超過65535)通過IP地址找到對應的服務器* 調(diào)用Socket的getInputStream()和getOutputStream()方法獲取和服務器端相連的IO流* 輸入流可以讀取服務器端輸出流寫出的數(shù)據(jù)* 輸出流可以寫出數(shù)據(jù)到服務端的輸入流* @throws IOException * @throws UnknownHostException * * * */public static void main(String[] args) throws UnknownHostException, IOException {Socket wsq = new Socket("192.168.1.182",1014); //創(chuàng)建Socket集裝箱對象wsq,并且指定想要發(fā)送他人的IP,和對應的端口號,連接服務器BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream())); //將字節(jié)流包裝成為字符流PrintStream ps = new PrintStream(wsq.getOutputStream()); //PrintStream中有寫出換行的方法 //將getInputStream()這個輸入字節(jié)流和getOutputStream()這個輸出字節(jié)流進行包裝,包裝之后,就可以直接讀一行,也可以直接寫出字符串,這樣的話,效率會更高//對于getInputStream()這個輸入字節(jié)流,輸入想整行讀,用BufferedReader,因為BufferedReader里面有ReadLine方法//對于getOutputStream()這個輸出字節(jié)流,這里不建議用BufferedWriter進行包裝,因為,BufferedWriter里面有個ReadLine方法,這個方法是以/r/n進行結束的,寫完之后還得調(diào)用newLine方法//這里建議用一個更好的流PrintStream,對getOutputStream()這個輸出字節(jié)流進行包裝,該流里面有個printLine方法,這個方法使你在寫出的時候直接加換行的,而且這個PrintLine方法也可以直接寫字符串System.out.println(br.readLine()); //讀出內(nèi)容ps.println("滾,mmp");System.out.println(br.readLine()); //讀出內(nèi)容ps.println("呵呵,你該唄兒厲害了~");wsq.close(); //關閉集裝箱對象wsq}}有常識可知,服務端是多線程的
package www.wsq.TCP; import java.io.BufferedReader; //java com.wsq.tcp.Demo2_Server import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket;public class Demo2_Server { /*** * 2,服務端* 創(chuàng)建ServerSocket(需要指定端口號)* 調(diào)用ServerSocket的accept()方法接受一個客戶端請求,得到一個Socket* 調(diào)用Socket的getInputStream()和getOutputStream()方法獲取和客戶端相連的IO流* 輸入流可以讀取客戶端輸出流寫出的數(shù)據(jù)* 輸出流可以寫出數(shù)據(jù)到客戶端的輸入流* @throws IOException * * */public static void main(String[] args) throws IOException {demo1();ServerSocket server = new ServerSocket(1014); //創(chuàng)建ServerSocket并且指定端口號 while(true){ //不斷地接收客戶端的請求final Socket wsq= server.accept(); //接收客戶端的請求,創(chuàng)建集裝箱對象wsq,調(diào)用accept方法來接收客戶端向服務端發(fā)出的請求//匿名內(nèi)部類具備變量,必須被final修飾new Thread(){ //每接收到客戶一條請求就開啟一條線程,運用匿名內(nèi)部類進行開啟線程public void run(){try {BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream())); //將字節(jié)流包裝成為字符流PrintStream ps = new PrintStream(wsq.getOutputStream()); //PrintStream中有寫出換行的方法 ps.println("歡迎來到哈哈哈哈我也不知道這是哪~~");System.out.println(br.readLine()); //readLine是以"\r\n"為結束標志的,沒有換行該行代碼就不會結束ps.println("你讓我怎樣我就怎樣,我的面子往哪放?我就不");System.out.println(br.readLine()); //讀出信息內(nèi)容} catch (IOException e) {e.printStackTrace();}}}.start();wsq.close(); //關閉socket集裝箱}}private static void demo1() throws IOException {ServerSocket server = new ServerSocket(1014); //創(chuàng)建ServerSocket并且指定端口號 Socket wsq= server.accept(); //接收客戶端的請求,創(chuàng)建集裝箱對象wsq,調(diào)用accept方法來接收客戶端向服務端發(fā)出的請求BufferedReader br = new BufferedReader(new InputStreamReader(wsq.getInputStream())); //將字節(jié)流包裝成為字符流PrintStream ps = new PrintStream(wsq.getOutputStream()); //PrintStream中有寫出換行的方法 ps.println("歡迎來到哈哈哈哈我也不知道這是哪~~");System.out.println(br.readLine()); //readLine是以"\r\n"為結束標志的,沒有換行該行代碼就不會結束ps.println("你讓我怎樣我就怎樣,我的面子往哪放?我就不");System.out.println(br.readLine());wsq.close(); //關閉socket集裝箱 }} 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結
以上是生活随笔為你收集整理的Java—— TCP协议(相关代码实现以及相关优化)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信阳治疗输卵管粘连最好的医院推荐
- 下一篇: Java——网络编程练习