Java使用TCP實(shí)現(xiàn)數(shù)據(jù)傳輸實(shí)例詳解
Java使用TCP實(shí)現(xiàn)數(shù)據(jù)傳輸實(shí)例詳解
TCP所提供服務(wù)的主要特點(diǎn):
1.面向連接的傳輸;
2.端到端的通信;
3.高可靠性,確保傳輸數(shù)據(jù)的正確性,不出現(xiàn)丟失或亂序;
4.全雙工方式傳輸;
5.采用字節(jié)流方式,即以字節(jié)為單位傳輸字節(jié)序列;
6.緊急數(shù)據(jù)傳送功能。
TCP傳輸需要建立客戶端和服務(wù)器端,即Socket和Server Socket , 建立連接后,通過Socket中的IO流進(jìn)行數(shù)據(jù)的傳輸 。傳輸結(jié)束后關(guān)閉Socket。
客戶端和服務(wù)器端是兩個(gè)獨(dú)立的應(yīng)用程序。
以下是實(shí)現(xiàn)基本的TCP數(shù)據(jù)傳輸?shù)腄emo code:
package javase.day18; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.ServerSocket; import java.net.Socket; public class TransTextDemo { public static void main(String[] args) { } } class TcpClient2{ public static void main(String[] args) throws Exception{ System.out.println("client start..."); Socket s = new Socket("192.168.1.2",10005); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String sendDataStr=null; while((sendDataStr=br.readLine())!=null){ if(sendDataStr.equals("bye")){ break; } bw.write(sendDataStr); bw.newLine(); bw.flush(); } bw.close(); } } class TcpServer2{ public static void main(String[] args) throws Exception{ System.out.println("server start..."); ServerSocket ss = new ServerSocket(10005); Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); String receiveDataStr=null; while((receiveDataStr=br.readLine())!=null){ if(receiveDataStr.equals("bye")){ break; } System.out.println("receive data:"+receiveDataStr); } } }
使用TCP實(shí)現(xiàn)文本文件上傳的Demo code:
package javase.day18; import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class UploadText { public static void main(String[] args) { // TODO Auto-generated method stub } } class TextServer{ public static void main(String[] args) throws Exception{ System.out.println("Server start..."); ServerSocket ss = new ServerSocket(10008); Socket s = ss.accept(); BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream())); PrintWriter out = new PrintWriter(new FileWriter("C:\\java_test\\server.txt"),true); String line=null; while((line=br.readLine())!=null){ System.out.println(line); out.println(line); } PrintWriter pw = new PrintWriter(new OutputStreamWriter(s.getOutputStream()),true); pw.println("upload successful"); pw.close(); s.close(); ss.close(); } } class TextClient{ public static void main(String[] args) throws Exception{ System.out.println("Client start..."); Socket clientSocket = new Socket("192.168.1.2",10008); BufferedReader br = new BufferedReader(new FileReader("C:\\java_test\\SystemDemo.java")); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),true); String line=null; while((line=br.readLine())!=null){ System.out.println(line); out.println(line); } clientSocket.shutdownOutput(); BufferedReader br2 = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); String confirmMsgStr=br2.readLine(); System.out.println(confirmMsgStr); br2.close(); clientSocket.close(); } }
實(shí)現(xiàn)圖片上傳的Demo code:
package javase.day18; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.net.ServerSocket; import java.net.Socket; public class UploadImage { public static void main(String[] args) { } } class ImageClient{ public static void main(String[] args) throws Exception{ Socket imageClientSocket = new Socket("192.168.1.2",10010); BufferedInputStream bis = new BufferedInputStream(new FileInputStream("C:\\java_test\\client\\生活用品01.jpg")); BufferedOutputStream bos = new BufferedOutputStream(imageClientSocket.getOutputStream()); byte[] buf = new byte[1024*100]; int len = 0 ; while((len=bis.read(buf))!=-1){ bos.write(buf,0,len); } imageClientSocket.shutdownOutput(); BufferedInputStream bis2 = new BufferedInputStream(imageClientSocket.getInputStream()); byte[] buf2 = new byte[1024]; int len2 = 0 ; while((len2=bis2.read(buf2))!=-1){ System.out.println(new String(buf2,0,len2)); } bis.close(); imageClientSocket.close(); } } class ImageServer{ public static void main(String[] args) throws Exception{ ServerSocket ss = new ServerSocket(10010); Socket s = ss.accept(); BufferedInputStream bis = new BufferedInputStream(s.getInputStream()); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\java_test\\server\\生活用品01.jpg")); byte[] buf = new byte[1024*100]; int len = 0 ; while((len=bis.read(buf))!=-1){ bos.write(buf, 0, len); } BufferedOutputStream bos2 = new BufferedOutputStream(s.getOutputStream()); bos2.write("upload successful".getBytes()); bos2.close(); s.close(); ss.close(); } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- 實(shí)現(xiàn)了基于TCP的Java Socket編程實(shí)例代碼
- Java實(shí)現(xiàn)Socket的TCP傳輸實(shí)例
- Java基于Tcp協(xié)議的socket編程實(shí)例
- Java基于TCP方式的二進(jìn)制文件傳輸
- Java編程實(shí)現(xiàn)多線程TCP服務(wù)器完整實(shí)例
- 基于java TCP網(wǎng)絡(luò)通信的實(shí)例詳解
- Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
- JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例
- Java面試基礎(chǔ)之TCP連接以及其優(yōu)化
相關(guān)文章
Java如何調(diào)用wsdl的webservice接口
這篇文章主要介紹了Java如何調(diào)用wsdl的webservice接口問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05IDEA @SpringBootApplication報(bào)錯(cuò)原因及解決
這篇文章主要介紹了IDEA @SpringBootApplication報(bào)錯(cuò)原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01Java數(shù)組隊(duì)列概念與用法實(shí)例分析
這篇文章主要介紹了Java數(shù)組隊(duì)列概念與用法,結(jié)合實(shí)例形式分析了Java數(shù)組隊(duì)列相關(guān)概念、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下2020-03-03重寫hashCode()和equals()方法詳細(xì)介紹
這篇文章主要介紹了重寫hashCode()和equals()方法詳細(xì)介紹,涉及重寫equals()方法,重寫hashCode()方法,重寫equals()而不重寫hashCode()的風(fēng)險(xiǎn)等相關(guān)內(nèi)容的介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫的方法示例
這篇文章主要介紹了Java實(shí)現(xiàn)Excel導(dǎo)入導(dǎo)出數(shù)據(jù)庫的方法,結(jié)合實(shí)例形式分析了java針對(duì)Excel的讀寫及數(shù)據(jù)庫操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-08-08Spring Boot使用Spring的異步線程池的實(shí)現(xiàn)
這篇文章主要介紹了Spring Boot使用Spring的異步線程池的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02Java迭代器實(shí)現(xiàn)Python中的range代碼實(shí)例
這篇文章主要介紹了Java迭代器實(shí)現(xiàn)Python中的range代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03全面解析JPA?倉庫repository中的findAll()方法
這篇文章主要介紹了全面解析JPA?倉庫repository中的findAll()方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02使用springboot 獲取控制器參數(shù)的幾種方法小結(jié)
這篇文章主要介紹了使用springboot 獲取控制器參數(shù)的幾種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12