網絡編程也就是常說的Socket編程。有TCP和UDP方式,每一種方式都分爲客戶端和服務器端,下面分別展示代碼
網絡通信三要素
網絡中設備的標識,不易記憶,可用主機名
爲了方便我們對IP地址的獲取和操作,java提供了一個類InetAddress 供我們使用。
獲取任意主機:getByName
主機名:getHostName
主機Ip地址:getHostAddress
用於標識進程的邏輯地址,不同進程的標識
A:每個網絡程序都會至少有一個邏輯端口
B:用於標識進程的邏輯地址,不同進程的標識
C:有效端口:0~65535,其中0~1024系統使用或保留端口。
通過360可以查看端口號
通訊的規則
常見協議:TCP,UDP
將數據源和目的封裝成數據包中,不需要建立連接;每個數據報的大小在限制在64k;因無連接,是不可靠協議;不需要建立連接,速度快
建立連接,形成傳輸數據的通道;在連接中進行大數據量傳輸;通過三次握手完成連接,是可靠協議;必須建立連接,效率會稍低
Socket
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();
}
}