一.首先是網絡編程的三要素:IP地址,端口號,通信協議
1.IP地址:通過docs命令:ipconfig
可以通過ping ip命令查看當前ip是否通暢:
2. 端口號:正在運行的程序標識。有效端口:0-65535,其中0~1024系統使用或保留端口,所以端口儘量要用1024以上的,可以使用netstat -ano命令查看所有運行程序的端口。太長了這裏截取一部分
3.通信協議:
常見的有兩種協議:
TCP和UDP協議
UDP:
將數據源和目的地封裝到數據包中,不需要建立連接。
每個數據包的大小限制在64K。
因爲不建立連接,所以安全性差,速度快。
TCP:
建立連接形成傳輸數據的通道,然後再傳輸數據,通過三次握手。
安全性高,效率低。
二.具體實現步驟
1.UDP協議方式:
UDPSend.java
package ch.hp.udp;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/**
* socket 網絡編程之UDP協議 發送方
*/
public class UDPSend {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();//創建DatagramSocket對象
String data = "UDP......";//要發送的數據
InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
DatagramPacket packet = new DatagramPacket(data.getBytes(),0,data.length(),inetAddress,9999);
socket.send(packet);//發送
socket.close();//關閉
}
}
UDPReceive.java
package ch.hp.udp;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* socket 網絡編程之UDP協議 接收方
*/
public class UDPReceive {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
//創建數據包對象 ,用於接收發送方發送的字節數組的數據
DatagramPacket packet = new DatagramPacket(new byte[4096],4096);
socket.receive(packet);//接收數據
byte[] data = packet.getData();//取出接收數據的內容
int length = data.length;//取出數據的長度
String result = new String(data,0,length);
System.out.println(result);//打印接收的數據
socket.close();
}
}
結果:
2.TCP協議方式:
ServerDemo.java
package ch.hp.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/**
* socket 網絡編程之TCP協議 服務端
*/
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(7777);
Socket socket = serverSocket.accept();//調用accept拿到一個socket對象
//拿到輸入輸出流
InputStream is = socket.getInputStream();
OutputStream os = socket.getOutputStream();
os.write("我是服務端響應道客戶端的數據".getBytes());
//讀取客戶端發送的請求參數
byte[] bytes = new byte[1024];
int len = is.read(bytes);
//將讀取的數據打印出來
String result = new String(bytes,0,len);
System.out.println(result);
}
}
ClientDemo.java
package ch.hp.tcp;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
/**
* socket 網絡編程之TCP協議 客戶端
*/
public class ClientDemo {
public static void main(String[] args) throws IOException {
//創建Socket對象,傳入主機ip和端口
Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),7777);
//輸入流,用於讀取服務端的數據
InputStream is = socket.getInputStream();
//輸出流,用於向服務端寫數據
OutputStream os = socket.getOutputStream();
//讀取服務端的數據
byte[] bytes = new byte[1024];
int len = is.read(bytes);
//將讀取的數據打印出來
String result = new String(bytes,0,len);
System.out.println(result);
//向服務端寫數據
os.write("我是客戶端寫入服務端的數據".getBytes());
socket.close();
}
}
TCP協議方式,注意需要先運行服務端;結果