java之socket編程

    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();//需要時關閉服務端
	}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章