JAVA 網絡編程簡單示例

網絡編程也就是常說的Socket編程。有TCP和UDP方式,每一種方式都分爲客戶端和服務器端,下面分別展示代碼


網絡通信三要素

lIP地址:InetAddress

  網絡中設備的標識,不易記憶,可用主機名

  要想讓網絡中的計算機能夠互相通信,必須爲每臺計算機指定一個標識號,通過這個標識號來指定要接受數據的計算機和識別發送的計算機,在TCP/IP協議中,這個標識號就是IP地址。
  
  那麼,我們如果獲取和操作IP地址呢?

     爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用。

  獲取任意主機:getByName

 

  主機名:getHostName

  主機Ip地址:getHostAddress


l端口號

  用於標識進程的邏輯地址,不同進程的標識

l物理端口網卡口
l邏輯端口我們指的就是邏輯端口

  A:每個網絡程序都會至少有一個邏輯端口

  B:用於標識進程的邏輯地址,不同進程的標識

  C:有效端口:0~65535,其中0~1024系統使用或保留端口。

  通過360可以查看端口號


l傳輸協議

  通訊的規則

  常見協議:TCP,UDP

lUDP

  將數據源和目的封裝成數據包中,不需要建立連接每個數據報的大小在限制在64k因無連接,是不可靠協議不需要建立連接,速度快

lTCP

  建立連接,形成傳輸數據的通道在連接中進行大數據量傳輸通過三次握手完成連接,是可靠協議必須建立連接,效率會稍低



Socket

Socket套接字:
網絡上具有唯一標識的IP地址和端口號組合在一起才能構成唯一能識別的標識符套接字。

Socket原理機制:
通信的兩端都有Socket。
網絡通信其實就是Socket間的通信。
數據在兩個Socket間通過IO傳輸。


1.TCP方式

1.1 TCP客戶端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

/*
 * Cilent端
 * 1.創建TCP Socket
 * 2.獲取Socket輸出流
 * 3.發送數據
 * 4.釋放資源
 * */
public class TCPKeyInputSendDemo {

	public static void main(String[] args) throws UnknownHostException, IOException {
		// 創建TCP Socket
		Socket s = new Socket("10.110.8.52", 12306);//此處換成本機的Ip地址或者目標機的Ip地址和隨機給出的端口號

		// 創建鍵盤輸入流,封裝Socket輸出流
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

		// 發送數據
		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
			
			if (".quit".equals(line)) {
				break;
			}
		}

		// 釋放資源
		s.close();
	}

}

1.2 TCP服務器端

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

/*
 * Server端
 * 1.創建TCP ServerSocket
 * 2.等待連接,並且獲取Socket
 * 3.獲取輸入流
 * 4.釋放資源
 * 
 * */
public class TCPKeyInputServerDemo {

	public static void main(String[] args) throws IOException {
		// 創建TCP ServerSocket
		ServerSocket ss = new ServerSocket(12306);//此處替換成你的端口號

		// 等待連接,並且獲取Socket
		Socket s = ss.accept();

		// 獲取輸入、輸出流,並且用高效字符流封裝
		BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("TcpServer.txt")));

		// 將數據寫入文件
		String line = null;
		while (true) {
			if ((line = br.readLine()) != null) {
				if (".quit".equals(line)) {
					break;
				}
				bw.write(line);
				bw.newLine();
				bw.flush();
			}
		}

		// 釋放資源
		s.close();
	}

}

2.UDP方式

2.1 UDP客戶端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * UDP客戶端
 *1.創建Socket套接字
 *2.創建發送數據包
 *3.發送數據
 *4.釋放資源
 * */
public class UDPDemo {

	public static void main(String[] args) throws IOException {
		// 創建Socket套接字
		// UDP使用的是DatagramSocket
		DatagramSocket ds = new DatagramSocket();

		// 創建發送數據包
		// DatagramPacket(byte[] buf, int length, InetAddress address, int port)
		byte[] buf = "Hello,我是網絡編程UDP".getBytes();
		int length = buf.length;
		InetAddress address = InetAddress.getByName("10.110.8.52");
		int port = 10010;
		DatagramPacket dp = new DatagramPacket(buf, length, address, port);

		// 發送數據
		ds.send(dp);

		// 釋放資源
		ds.close();
	}

}

2.2 UDP服務器端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

/*
 * UDP協議的服務器端
 * 1.創建套接字
 * 2.創建接收數據包
 * 3.接收數據
 * 4.解析數據
 * 5.釋放資源
 * 
 * */
public class UDPDemoServer {

	public static void main(String[] args) throws IOException {
		// 創建套接字
		// DatagramSocket(int port)
		DatagramSocket ds = new DatagramSocket(10010);

		// 創建接收數據包
		// DatagramPacket(byte[] buf, int length)
		byte[] buf = new byte[1024];
		int length = buf.length;
		DatagramPacket dp = new DatagramPacket(buf, length);

		// 接收數據
		// receive(DatagramPacket p)
		ds.receive(dp);

		// 獲取源主機的地址
		// InetAddress getAddress()
		InetAddress address = dp.getAddress();
		String ip = address.getHostAddress();

		// 解析數據
		byte[] buf2 = dp.getData();
		int length2 = dp.getLength();
		String string = new String(buf2, 0, length2);

		System.out.println("IP地址:"+ ip + ", 收到的數據是 " + string);

		// 釋放資源
		ds.close();
	}

}



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