標籤:概念 sock 串連 資料包 資源 pack local 常用 oca
學習Socket需要瞭解的幾個概念:
Socket 指的是互連網串連中的各個終結點。互連網串連是怎麼建立的,通過IP地址加連接埠號碼,進行互連。
A電腦(192.168.3.125:80)》》》》B電腦(192.168.3.111:80) 那麼這一個個的Ip地址+連接埠號碼就是一個Socket(通訊端。)
Http協議:兩台互連網的通訊需要遵守統一的應用程式層協議,通常指Http協議。應用程式層協議還有FTP協議,SMPT簡單郵件協議等。
底層協議:IP/TCP協議。除了http需要遵守,還需要遵守IP/TCP協議。
URL: 應用程式層協議+IP地址+連接埠號碼+資源路徑 例如 http://www.baidu.com/index.html; (http協議預設遵守的連接埠號碼為80) 檔案傳輸預設為21 遠程登入Telnet 23
Java中提供的支援Socket操作的幾個常用類:
InetAddress :就是表示IP地址啦,沒有建構函式。可以用過靜態方法InetAddress.getLocalhost()等方法來或者原生InetAddress對象。toString方法就是列印IP地址。其他方法請參見api文檔。
URL: 資來源物件。 就是上面所說的URL對象。
Socket:send方法,getOutPutStream() getInputStream()等
DatagramSocket:資料包,UDP傳輸儲存資料的類。
IP/TCP傳輸:有序,規則,穩定安全。但速度較慢。
服務端:
package tcp_ip;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;/** * tcp/ip傳輸 伺服器端 * @author Administrator * */public class Server { public static void main(String[] args) throws IOException { //建立伺服器端socket ServerSocket serverSocket = new ServerSocket(9999); //建立指定連接埠的serverSocket後 設定監聽狀態! 會阻塞 System.out.println("socket服務端啟動成功!正在監聽9999連接埠......"); Socket socket = serverSocket.accept(); //成功接收到請求後會返回一個socket InputStream is = socket.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader reader = new BufferedReader(isr); String data = reader.readLine(); while(data!=null&&!data.equals("")){ System.out.println(data); data=reader.readLine(); } reader.close(); isr.close(); is.close(); socket.close(); }}
用戶端:
package tcp_ip;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;public class Client { public static void main(String[] args) throws Exception { //建立client用戶端指定目標ip及連接埠 (即目標socket) Socket socket = new Socket("localhost", 9999); //或者這個socket的輸出資料流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(outputStream); writer.write("我是用戶端,我發送給你的內容是"+"你好啊!服務端!"); writer.close(); outputStream.close(); socket.close(); }}
//多線程版本:
服務端:
package tcp_ip;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class ServerThread { public static void main(String[] args) throws IOException { //建立伺服器端socket ServerSocket serverSocket = new ServerSocket(9999); //建立指定連接埠的serverSocket後 設定監聽狀態! 會阻塞 System.out.println("socket服務端啟動成功!正在監聽9999連接埠......"); while(true){ Socket socket = serverSocket.accept(); new RunThread(socket).start(); } }}
用戶端:
package tcp_ip;import java.io.IOException;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.net.Socket;public class Client { public static void main(String[] args) throws Exception { //建立client用戶端指定目標ip及連接埠 (即目標socket) Socket socket = new Socket("localhost", 9999); //或者這個socket的輸出資料流 OutputStream outputStream = socket.getOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(outputStream); writer.write("我是用戶端,我發送給你的內容是"+"你好啊!服務端! 又給你發啦~~"); writer.close(); outputStream.close(); socket.close(); }}
UDP傳輸:無序,不規則,不安全,速度快。
服務端:
package udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;/** * udp用戶端 * @author Czt * */public class Client { public static void main(String[] args) { try { String data=new String("你好啊!----來自用戶端的訊息!".getBytes(),"utf-8"); DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788); DatagramSocket socket = new DatagramSocket(); socket.send(datagramPacket); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
用戶端:
package udp;import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;import java.net.UnknownHostException;/** * udp用戶端 * @author Czt * */public class Client { public static void main(String[] args) { try { String data=new String("你好啊!----來自用戶端的訊息!".getBytes(),"utf-8"); DatagramPacket datagramPacket = new DatagramPacket(data.getBytes(),data.length(),InetAddress.getLocalHost(),7788); DatagramSocket socket = new DatagramSocket(); socket.send(datagramPacket); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}
JAVA Socket基礎(簡單實現)