---------------------ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! --------------------java
要創建鏈接,能夠傳輸大量數據 經過三次握手玩成鏈接是可靠協議 必須創建鏈接,效率低,例如:下載,打電話服務器
步驟:Socket和ServerSocket網絡
簡介:創建客戶端和服務器端socket
經過Socket中的IO流進行數據傳輸spa
關閉socket.net
一樣,客戶端和服務器端是兩個獨立的應用程序code
客戶端(Socket)和服務器端(ServerSocket)server
客戶端:在該對象建立的時候,就指定了主機地址,由於要先TCP必需要創建好鏈接,進行傳輸,或者使用connet方法來制定端口對象
客戶端對象裏面封裝了字節讀取流和寫入流。這樣更方便發送和接受數據。不斷是服務端仍是客戶端,只要是對其傳輸的數據進行訪問,那麼就在Socket對象中獲取流。資源
步驟:
1.建立服務,指定鏈接的主機和端口
2.得到輸出流 而後輸出數據
3.關閉服務
服務端:
1創建服務端的服務,ServerSocket,綁定端口
2獲取鏈接過來的客戶端對象 ServerSocket的accept方法。
3客戶端若是發過來數據,那麼服務端要使用對應的客戶端對象,而後客戶端對象的讀取流來讀取發過來的數據,打印在控制檯上
4關閉服務端。
模擬客戶端向服務端發數據,服務端讀取客戶端發送的數據後,而後輸出。
import java.io.OutputStream; import java.net.Socket; /** * 客戶端 * 1.定義服務端服務,指定目的地址和端口號 * 2.得到寫入流,而後發發送的數據,而且發出 * 3.關閉客戶端 * */ public class CilentTcp { public static void main(String[] args) throws Exception{ /*建立了客戶端服務,而且指定目的主機和端口號*/ Socket client=new Socket("192.168.1.101",10005); /*獲取輸出流,用來發送數據*/ OutputStream out=client.getOutputStream(); out.write("hello world".getBytes()); client.close(); } }
import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; /** * 服務端 * 1.定義服務端,而後指定服務端口 * 2.使用accept()方法得到客戶端對象,而後獲取讀取流 * 3.而後讀取客戶端發送的數據 */ public class ServerTcp { public static void main(String[] args) throws Exception { /* 建立了服務端,而且指定端口號 */ ServerSocket server = new ServerSocket(10005); Socket socket = server.accept();// 得到了發送端對象 InputStream in = socket.getInputStream();// 得到讀取流,用來讀取發送端發送過來的數據 byte[] buf = new byte[1024]; int r = in.read(buf);//讀取 System.out.println(new String(buf, 0, r)); } } 結果: hello world
必需要先啓動服務端,而後運行客戶端,不然會鏈接失敗
客戶端:
步驟:
1.創建Socket服務,而且指定要鏈接的主機和端口。
2.得到Socket流中的輸出流,將數據寫到流中,經過網絡發送給服務端
3.獲取Socket流中的輸入流,將服務端反饋回來的數據獲取到,而且打印
4.關閉客戶端資源
mportjava.io.InputStream; importjava.io.OutputStream; import java.net.Socket; importjava.net.InetAddress; /** * 客戶端 */ public class ClientTcp { public static void main(String[]args) throws Exception { /*得到客戶端服務*/ Socketclient = new Socket("192.168.32.17", 25000); /* * 得到客戶端流中的輸出流,而且把數據寫到流中,而後傳給的服務端 */ OutputStreamout = client.getOutputStream(); out.write("服務端,你在嗎".getBytes()); /** * 得到客戶端總的輸出流,而後或得服務端反饋回來的數據,而且打印 */ InputStreamin=client.getInputStream(); byte [] buf=new byte[1024]; int len=in.read(buf); System.out.println(newString(buf,0,len)); client.close(); } }
服務端:
步驟:
1.創建ServerSocket服務,而且指定端口號。
2.得到客戶端服務對象,輸出客戶端的地址
3.得到客戶端的輸入流,讀取客戶端發送的數據,而且打印。
4.得到客戶端的輸出流,給客戶端發送反饋信息。
5.關閉服務端服務和客戶端服務。
import java.io.InputStream; importjava.io.OutputStream; importjava.net.ServerSocket; import java.net.Socket; /** * 服務端 */ public class ServerTcp { public static void main(String[]args) throws Exception { /* 建立了服務端,而且指定端口號 */ ServerSocketserver = new ServerSocket(25000); Socketsocket =server.accept();// 得到了發送端對象 System.out.println(socket.getLocalAddress()+"connectsuccess"); /** * 或得客戶端的輸入流,讀取客戶端發送的數據,而且打印 */ InputStreamin = socket.getInputStream();// 得到讀取流,用來讀取發送端發送過來的數據 byte[] buf = new byte[1024]; int r = in.read(buf);// 讀取 System.out.println(new String(buf, 0,r)); /** * 得到客戶端的輸出流,給客戶端反饋信息 */ OutputStream out=socket.getOutputStream(); out.write("客戶端,我在呢?要幹嗎啊!!".getBytes()); socket.close(); server.close(); } }
accept()和read()方法都是阻塞方法。
對於雙方都通訊的話,那麼循環讀取的話,用到IO讀取,那麼必須注意換行符,和刷新緩衝區。一般都是讀取一行的話,那麼要注意是否有換行符,newLine().
在網絡傳輸文件
客戶端:
步驟:1.定義服務端,一樣也要指定目標地址和端口號。
2.定義對文件相應的流,讀取文件。
3.獲取客戶端的輸出流,和文件的讀取交替讀取和寫入。
4.得到客戶端的輸入流,獲取服務端反饋的信息。
package www.fuxi.wangluo; import java.io.BufferedReader; import java.io.FileReader; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; /** * 客戶端 * @author yang */ public class TextClient { public static void main(String[] args) throws Exception{ Socket socket=new Socket("192.168.1.101",25001); /** * 得到文件的讀取流,而後循環的讀取文件 */ BufferedReader br=new BufferedReader(new FileReader("copy.txt")); /** * 得到服務端的輸入流,用來把要複製的文件內容,輸入到網絡流中 */ PrintWriter pr=newPrintWriter(socket.getOutputStream(),true);//true表明自動刷新 String line=null; while((line=br.readLine())!=null){ pr.println(line);//println有自動刷新功能 } socket.shutdownOutput();//關閉客戶端的輸出流,至關於結束標記 /** * 得到文件的輸出流,用來得到服務端反饋的信息 */ BufferedReader brs=new BufferedReader(new InputStreamReader(socket.getInputStream())); String str=null; str=brs.readLine(); System.out.println(str); brs.close(); br.close(); socket.close(); } }
服務端:
步驟:1.定義服務端服務,而後指定端口號。
2.得到客戶端對象,而後從中獲取讀取流。
3.定義新文件的寫入流,這樣把讀取流中的內容寫入到新文件中。
4.得到客戶端的寫入流,反饋給客戶端信息。
package www.fuxi.wangluo; import java.io.BufferedReader; import java.io.FileWriter; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; /** * 服務端 */ public class TextServer { public static void main(String[] args) throws Exception { /** * 定義服務端,而後得到客戶端服務對象 */ ServerSocket server = new ServerSocket(25001); Socket socket=server.accept(); /** * 得到客戶端的讀取流,這樣讀取文件內容 */ BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream())); /** * 得到目標文件的寫入流,用來寫入文件內容 */ PrintWriter pr=new PrintWriter(new FileWriter("newCopy.txt"),true); String line=null; while((line=br.readLine())!=null){ pr.println(line); } /** * 得到客戶端的寫入流,這樣把信息反饋給客戶端 */ PrintWriter prs=new PrintWriter(socket.getOutputStream()); prs.println("上傳成功!"); pr.close(); prs.close(); br.close(); server.close(); } } 結果:上傳成功
注意點:必定要定義結束標記,不然會不會中止上傳,結束標記能夠自定義,也可使用Socket中自帶的方法來結束。
---------------------ASP.Net+Android+IOS開發、.Net培訓、期待與您交流! --------------------