Socket就是爲網絡服務提供的一種機制,網絡通信的兩端都有Socket,一個Socket由一個IP地址和一個端口號唯一確定。數據在兩個Socket間通過IO傳輸。
1.其傳輸方式有兩種,UDP傳輸和TCP傳輸:
UDP傳輸:在發送數據前不需要先建立連接,速度快;是不可靠協議;每個數據包的大小限制在64kb內。主要應用在網絡視屏會議,桌面共享等場合,丟點數據不會對結果產生影響。
TCP傳輸:發送數據前要先建立連接,是可靠協議;但效率較低;可以進行大數據量傳輸。主要應用在文件傳輸,下載等場合,對數據的完整性要求很高。
2.socket傳輸流程:
(1)建立socket服務,建立數據包
UDP:datagramsocket與datagrampacket
TCP:客戶端 socket 與服務端 server socket
(2)建立發送端和接收端
發送端:要在在數據包對象中明確目的地的ip及端口
接收端:要指定監聽的端口
(3)調用socket的發送和接受方法
(4)關閉socket服務
3.UDP傳輸實例:
class UdpSend{ public static void main(String[] args) throws Exception{ //1,創建udp服務。通過DatagramSocket對象。 DatagramSocket ds = new DatagramSocket(8888); //2,確定數據,並封裝成數據包。 byte[] buf = "udp ge men lai le ".getBytes(); DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("222.195.152.1"),5000); //3,通過socket服務,將已有的數據包發送出去。通過send方法。 ds.send(dp); //4,關閉資源。 ds.close(); } } class UdpReceive{ public static void main(String[] args) throws Exception { //1,創建udp socket,建立端點。 DatagramSocket ds = new DatagramSocket(5000); while(true) { //2,定義數據包。用於存儲數據。 byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf,buf.length); //3,通過服務的receive方法將收到數據存入數據包中。 ds.receive(dp);//阻塞式方法。 //4,通過數據包的方法獲取其中的數據。 String ip = dp.getAddress().getHostAddress(); String data = new String(dp.getData(),0,dp.getLength()); int port = dp.getPort(); System.out.println(ip+":"+data+":"+port); } //5,關閉資源 //ds.close(); } }
4.TCP單向傳輸實例:
import java.io.*; import java.net.*; class TcpClient{ public static void main(String[] args) throws Exception { //創建客戶端的socket服務。指定目的主機和端口 Socket s = new Socket("222.195.152.1",5001); //爲了發送數據,應該獲取socket流中的輸出流。 OutputStream out = s.getOutputStream(); out.write("test tcp communication".getBytes()); s.close(); } } class TcpServer{ public static void main(String[] args) throws Exception{ //建立服務端socket服務。並監聽一個端口。 ServerSocket ss = new ServerSocket(5001); //通過accept方法獲取連接過來的客戶端對象。 while(true) { Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip+"has been connected"); //獲取客戶端發送過來的數據,使用客戶端對象的讀取流來讀取數據。 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close();//關閉客戶端. } //ss.close();//需要時關閉服務端 } }