java网络编程之TCP通讯
生活随笔
收集整理的這篇文章主要介紹了
java网络编程之TCP通讯
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
java中的網(wǎng)絡(luò)編程之TCP協(xié)議的詳細(xì)介紹,以及如何使用,同時(shí)我在下面舉2例說明如何搭配IO流進(jìn)行操作,
1 /* 2 *TCP 3 *建立連接,形成傳輸數(shù)據(jù)的通道; 4 *在連接中進(jìn)行大數(shù)據(jù)量傳輸; 5 *通過三次握手完成連接,是可靠協(xié)議; 6 *必須建立連接,效率會(huì)稍低 7 */ 8 9 /* 10 * TCP傳輸 11 * Socket和ServerSocket建立客戶端和服務(wù)器端建立連接后, 12 * 通過Socket中的IO流進(jìn)行數(shù)據(jù)的傳輸關(guān)閉socket同樣, 13 * 客戶端與服務(wù)器端是兩個(gè)獨(dú)立的應(yīng)用程序。 14 */ 15 16 //------------------------------- 17 //下面的是TCP協(xié)議的服務(wù)器端代碼 18 19 import java.io.IOException; 20 import java.io.InputStream; 21 import java.net.ServerSocket; 22 import java.net.Socket; 23 24 /* 25 * TCP協(xié)議接收數(shù)據(jù) 26 * 1.創(chuàng)建接收端的socket對(duì)象 27 * 2.監(jiān)聽客戶端,返回一個(gè)對(duì)應(yīng)的socket對(duì)象 28 * 3.獲取輸入流,讀取數(shù)據(jù),顯示在控制臺(tái) 29 * 4.釋放資源 30 */ 31 public class ServerDemo { 32 public static void main(String[] args) throws IOException { 33 // 創(chuàng)建接收端socket對(duì)象 34 ServerSocket ss = new ServerSocket(10086); 35 36 // 監(jiān)聽客戶端,返回一個(gè)對(duì)應(yīng)的socket對(duì)象 37 // public Socket accept() 偵聽并接受到此套接字的連接。 38 Socket s = ss.accept(); // 阻塞式方法,直到通道建立 39 40 // 獲取輸入流,讀取數(shù)據(jù) 41 InputStream is = s.getInputStream(); 42 byte[] bys = new byte[1024]; 43 int len = is.read(bys); // 阻塞式方法,直到數(shù)據(jù)發(fā)過來。 44 String ip = s.getInetAddress().getHostAddress(); 45 46 String str = new String(bys, 0, len); 47 System.out.println(str); 48 49 // 釋放資源 50 s.close(); 51 ss.close(); // 這個(gè)不應(yīng)該關(guān)閉 52 } 53 } 54 55 //------------------------------- 56 //下面是客戶端TCP協(xié)議的代碼 57 import java.io.IOException; 58 import java.io.OutputStream; 59 import java.net.Socket; 60 61 /* 62 *TCP協(xié)議發(fā)送數(shù)據(jù): 63 * 1.創(chuàng)建發(fā)送端socket對(duì)象 64 * 這一步如果成功,就說明鏈接已經(jīng)成功了。 65 * 2.獲取輸出流,寫數(shù)據(jù) 66 * 3.釋放資源 67 * 68 *TCP一些服務(wù)器必須先開啟,保證通道簡(jiǎn)歷,否則直接報(bào)錯(cuò)。 69 *java.net.ConnectException: Connection refused: connect 70 */ 71 public class ClientDemo { 72 public static void main(String[] args) throws IOException { 73 // 創(chuàng)建發(fā)送端socket對(duì)象 74 // Socket(String host, int port) 創(chuàng)建一個(gè)流套接字并將其連接到指定主機(jī)上的指定端口號(hào)。 75 Socket socket = new Socket("lpp-PC", 10086); 76 //“l(fā)pp-PC”里面的字符串一般使用服務(wù)器端的IP地址代替。 77 78 // 獲取輸出流,寫數(shù)據(jù) 79 OutputStream os = socket.getOutputStream(); 80 os.write("TCP coming~~~".getBytes()); 81 82 // 關(guān)閉資源 83 os.close(); 84 } 85 } 1 //================================== 2 //--------------------------------------------------------------- 3 //下面給出一個(gè)案例:客戶端從指定文本文件讀取數(shù)據(jù),發(fā)送到服務(wù)器端, 4 //服務(wù)器將接收到的數(shù)據(jù),再次寫入到一個(gè)新的文本文件。數(shù)據(jù)的寫/出是字節(jié) 5 //流 6 7 //首先給出的是客戶端的代碼: 8 import java.io.BufferedReader; 9 import java.io.BufferedWriter; 10 import java.io.FileReader; 11 import java.io.IOException; 12 import java.io.InputStreamReader; 13 import java.io.OutputStreamWriter; 14 import java.net.Socket; 15 16 /* 17 * 客戶端從文本文件中讀取數(shù)據(jù),服務(wù)器得到數(shù)據(jù)寫入到文本文件, 18 * 為了在服務(wù)器寫完數(shù)據(jù)后,給客戶端一個(gè)反饋,但是直接在通道內(nèi)額外的添加數(shù)據(jù)是不行,會(huì)導(dǎo)致雙方一直保持等待狀態(tài) 19 * 方案 20 * 1: 在客戶端里面額外增加一條語句告訴服務(wù)器結(jié)束的標(biāo)志。 21 * 2: 直接使用JDK給出的方法:shutdownOutput();socket提供了一個(gè)中止功能,它會(huì)通知服務(wù)器別等了,我沒有數(shù)據(jù)過來了。 22 */ 23 24 public class ClientDemo { 25 public static void main(String[] args) throws IOException { 26 // 客戶端socket對(duì)象 27 Socket s = new Socket("lpp-PC", 12345); 28 29 // 封裝數(shù)據(jù)源 30 BufferedReader br = new BufferedReader(new FileReader("a.txt")); 31 32 // 封裝通道內(nèi)流 33 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter( 34 s.getOutputStream())); 35 36 // 寫入數(shù)據(jù) 37 String line = null; 38 while ((line = br.readLine()) != null) { 39 bw.write(line); 40 bw.newLine(); 41 bw.flush(); 42 } 43 44 // // 為了告訴服務(wù)器寫到這里就可以停止了,額外增加一個(gè)標(biāo)記,自定義一個(gè)結(jié)束標(biāo)記 45 // bw.write("over"); 46 // bw.newLine(); 47 // bw.flush(); 48 49 //socket提供了一個(gè)中止功能,它會(huì)通知服務(wù)器別等了,我沒有數(shù)據(jù)過來了。 50 s.shutdownOutput(); 51 52 // 接受服務(wù)器的反饋 53 BufferedReader brClient = new BufferedReader(new InputStreamReader( 54 s.getInputStream())); 55 String str = brClient.readLine(); 56 System.out.println(str); 57 58 // 釋放資源 59 br.close(); 60 s.close(); 61 } 62 } 63 64 65 //------------------------------------------ 66 //下面是服務(wù)器端的代碼 67 68 69 import java.io.BufferedReader; 70 import java.io.BufferedWriter; 71 import java.io.FileReader; 72 import java.io.FileWriter; 73 import java.io.IOException; 74 import java.io.InputStreamReader; 75 import java.io.OutputStreamWriter; 76 import java.net.ServerSocket; 77 import java.net.Socket; 78 79 public class ServerDemo { 80 public static void main(String[] args) throws IOException { 81 // 服務(wù)端socke對(duì)象 82 ServerSocket ss = new ServerSocket(12345); 83 84 // 監(jiān)聽客戶端,獲取socke對(duì)象 85 Socket s = ss.accept(); 86 87 // 封裝目標(biāo)文件 88 BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt")); 89 90 // 封裝通道中的輸入流 91 BufferedReader br = new BufferedReader(new InputStreamReader( 92 s.getInputStream())); 93 94 // 讀取數(shù)據(jù),并將數(shù)據(jù)寫入文件 95 String line = null; 96 while ((line = br.readLine()) != null) { 97 // if ("over".equals(line)) { 98 // break; 99 // } 100 bw.write(line); 101 bw.newLine(); 102 bw.flush(); 103 } 104 105 // 在文件寫出完畢后,給客戶端一個(gè)反饋, 106 BufferedWriter bwServer = new BufferedWriter(new OutputStreamWriter( 107 s.getOutputStream())); 108 bwServer.write("數(shù)據(jù)寫入完畢"); 109 bwServer.newLine(); 110 bwServer.flush(); 111 112 // 釋放資源 113 bw.close(); 114 s.close(); 115 116 } 117 }?//======================================
//下面的這個(gè)例子是客戶端讀取的是圖片文件/視頻文件。而服務(wù)器會(huì)對(duì)象通過TCP協(xié)議讀取到的數(shù)據(jù)寫到對(duì)應(yīng)格式的文中去。
1 //先是服務(wù)器端的class文件 2 3 import java.io.BufferedInputStream; 4 import java.io.BufferedOutputStream; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.io.OutputStream; 8 import java.net.ServerSocket; 9 import java.net.Socket; 10 11 public class ServerDemo { 12 public static void main(String[] args) throws IOException { 13 // 服務(wù)端socke對(duì)象 14 ServerSocket ss = new ServerSocket(23456); 15 16 // 監(jiān)聽客戶端,獲取socket 17 Socket s = ss.accept(); 18 19 // 封裝通道內(nèi)流數(shù)據(jù) 20 BufferedInputStream bis = new BufferedInputStream(s.getInputStream()); 21 22 // 封裝圖標(biāo)目的地 23 BufferedOutputStream bos = new BufferedOutputStream( 24 new FileOutputStream("lpp.jpg")); 25 26 byte[] bys = new byte[1024]; 27 int len = 0; 28 while ((len = bis.read(bys)) != -1) { 29 bos.write(bys, 0, len); 30 bos.flush(); // 尤其是在通道內(nèi)部使用時(shí),必須使用flush否則丟包 31 } 32 33 // 給一個(gè)反饋 34 OutputStream os = s.getOutputStream(); 35 os.write("圖片上傳成功".getBytes()); 36 37 // 釋放資源 38 bos.close(); 39 s.close(); 40 41 } 42 } 43 44 45 //------------------------------------------------ 46 //下面的是客戶端的class文件 47 48 import java.io.BufferedInputStream; 49 import java.io.BufferedOutputStream; 50 import java.io.File; 51 import java.io.FileInputStream; 52 import java.io.IOException; 53 import java.io.InputStream; 54 import java.io.OutputStream; 55 import java.net.Socket; 56 57 /* 58 * 客戶端讀取一個(gè)數(shù)據(jù),通過TCP協(xié)議發(fā)送到服務(wù)器 59 */ 60 public class ClientDemo { 61 public static void main(String[] args) throws IOException { 62 // 客戶端socke對(duì)象 63 Socket s = new Socket("lll-PC", 23456); 64 65 // 封裝數(shù)據(jù)源 66 BufferedInputStream bis = new BufferedInputStream(new FileInputStream( 67 "a.jpg")); 68 69 // 封裝通道數(shù)據(jù)流 70 BufferedOutputStream bos = new BufferedOutputStream(s.getOutputStream()); 71 72 byte[] bys = new byte[1024]; 73 int len = 0; 74 while ((len = bis.read(bys)) != -1) { 75 bos.write(bys, 0, len); 76 bos.flush(); //尤其是在通道內(nèi)部使用時(shí),必須使用flush否則丟包 77 } 78 79 // 讀取反饋,關(guān)閉寫入流,并告知服務(wù)器端,服務(wù)器端的阻塞不再等待向下執(zhí)行 80 s.shutdownOutput(); 81 82 InputStream is = s.getInputStream(); 83 byte[] buf = new byte[1024]; 84 int len2 = is.read(buf); 85 String clientStr = new String(buf, 0, len2); 86 System.out.println(clientStr); 87 88 // 釋放資源 89 bis.close(); 90 s.close(); 91 92 } 93 }?
轉(zhuǎn)載于:https://www.cnblogs.com/fuck1/p/5430960.html
總結(jié)
以上是生活随笔為你收集整理的java网络编程之TCP通讯的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux-CentOS 重置root密
- 下一篇: Git远程和分支管理