//獲取本機的InetAddress實例
InetAddress address = InetAddress.getLocalHost();
System.out.println("計算機名:"+ address.getHostName());
System.out.println("IP地址:"+address.getHostAddress());
//獲取字節數組形式的IP地址
byte[] bytes = address.getAddress();
System.out.println("字節數組形式的IP:"+Arrays.toString(bytes));
System.out.println(address);
//根據主機名獲取InetAddress實例
InetAddress address2 = InetAddress.getByName("localhost");
System.out.println("計算機名:"+ address2.getHostName());
System.out.println("IP地址:"+address2.getHostAddress());
//創建URL實例—————
URL urlString = new URL("http://www.baidu.com");
URL url = new URL(urlString, "/index.html?username = tom#test");
System.out.println("協議:"+url.getProtocol());
System.out.println("主機:"+url.getHost());
//未指定端口號 使用默認端口號 此時Por方法返回值是-1
System.out.println("端口:"+url.getPort());
System.out.println("文件路徑:"+url.getPath());
System.out.println("文件名:"+url.getFile());
System.out.println("相對路徑:"+url.getRef());
System.out.println("查詢字符轉:"+url.getQuery());
// 端口:-1
// 文件路徑:/index.html
// 文件名:/index.html?username = tom
// 相對路徑:test
// 查詢字符轉:username = tom
// 通過URL對象的openSteam()方法可以得到執行的資源輸入流
// 通過輸入流可以讀取、訪問網絡上的數據
// 使用讀取網頁內容
URL urlS = new URL("http://www.baidu.com");
try {
// 通過URL的openSream方法獲取URL對象所表示的資源字節輸入
InputStream is = urlS.openStream();
// 將字節輸入流轉換爲字節輸入流
InputStreamReader isr = new InputStreamReader(is);
// 爲字符輸入流添加到緩衝
BufferedReader br = new BufferedReader(isr);
String data = br.readLine(); //讀取數據
while (data!= null) {
System.out.println(data);
data = br.readLine();
}
br.close();
isr.close();
is.close();
Socket TCP編程
// Socket實現步驟
// 創建ServerSocket和Socket 打開連接到Socket的輸入輸出流
// 服務器端
// 1、創建ServerSocket對象,綁定監聽端口 2、通過accept()方法監聽客戶端請求
// 3、連接建立後,通過輸入流讀取客戶端發送的請求信息 4、通過輸出流向客戶點發送相應信息
// 5、關閉相關資源
// 客戶端
// 1、創建Socket對象,指明需要連接的服務器的地址和端口號
// 2、連接建立後,通過輸出流流向服務器端發送請求信息
// 3、通過輸入流獲取服務器相應的信息 4、關閉相關資源
//服務器線程處理類————
public class ServerThread extends Thread {
// 和本線程相關的socket
Socket socket = null;
public ServerThread(Socket socket){
this.socket = socket;
}
// 線程執行的操作, 響應客戶端的請求
public void run() {
//
// 獲取輸入流 並讀取客戶端信息
InputStream is = null;
InputStreamReader isr= null;
// 爲輸入流添加緩衝
BufferedReader br = null;
// 獲取輸出流響應客戶端的請求
OutputStream os = null;
PrintWriter pw = null;
try {
is = socket.getInputStream();
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String info = null;
while ((info = br.readLine()) != null) {// 循環讀取客戶端的信息
System.out.println("我是服務器, 客戶端說:"+ info);
}
socket.shutdownInput();// 關閉輸入流
os = socket.getOutputStream();
pw = new PrintWriter(os);
pw.write("hello lanuch");
pw.flush(); //將緩衝輸出
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
if(pw!=null)
// 關閉相關的資源
pw.close();
if(os!= null)
os.close();
if(br!= null)
br.close();
if(isr!= null)
isr.close();
if(is!= null)
is.close();
if(socket!= null)
socket.close();
//基於TCP協議的Socket通信實現登錄=============
// 服務器端
// 創建服務器端Socket ServerSocket 指定綁定的端口號,並監聽此端口
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket = null;
// 記錄客戶端的數量
int count = 0;
System.out.println("**服務器即將啓動,等待客戶端的連接***");
while(true){
// 調用accept()方法開始監聽 等待客戶端連接
socket = serverSocket.accept();
// 創建一個新線程
ServerThread serverThread = new ServerThread(socket);
// 啓動線程
serverThread.start();
count++;
System.out.println("客戶端的數量"+count);
}
//// 獲取輸入流 並讀取客戶端信息
// InputStream is = socket.getInputStream(); //字節輸入流
// InputStreamReader isr = new InputStreamReader(is); //將字節流轉換爲字符流
//// 爲輸入流添加緩衝
// BufferedReader br = new BufferedReader(isr);
// String info = null;
// while ((info = br.readLine()) != null) {// 循環讀取客戶端的信息
//
// System.out.println("我是服務器, 客戶端說:"+ info);
// }
// socket.shutdownInput();// 關閉輸入流
//
//// 獲取輸出流響應客戶端的請求
// OutputStream os = socket.getOutputStream();
// PrintWriter pw = new PrintWriter(os); //包裝打印流
// pw.write("hello lanuch");
// pw.flush(); //將緩衝輸出
//
//// 關閉相關的資源
// pw.close();
// os.close();
//
// br.close();
// isr.close();
// is.close();
// socket.close();
// serverSocket.close();
客戶端——————————————————
1.創建客戶端Socket 指定服務器地址和端口
Socket socket = new Socket("127.0.0.1", 8888);
// 2.獲取輸出流,向服務器端發送信息
OutputStream os = socket.getOutputStream(); //字節輸出流
PrintWriter pw = new PrintWriter(os); //將輸出流包裝爲打印流輸出
pw.write("用戶名:admin2 ;密碼:1233");
pw.flush();
socket.shutdownOutput(); //關閉輸出流
// 獲取輸入流讀取服務器端的響應信息
InputStream is = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String info = null;
while((info = br.readLine() )!= null){
System.out.println("我是客戶端 服務器說:"+info);
}
// 關閉資源
br.close();
is.close();
pw.close();
os.close();
socket.close();
基於UDP的Socket編程
客戶端
/ 1、定義發送信息 2、創建DatagramPacket包含將要發送的信息
// 3、創建DatagramSocket 4、發送數據
public static void main(String[] args) throws IOException {
// 向服務器端發送數據
// 1.定義服務器的地址、端口號、數據
InetAddress address = InetAddress.getByName("localhost");
int port = 8800;
byte[] data = "用戶名: admin; 密碼:123".getBytes();
// 創建數據報,包含發送的數據信息
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
// 創建DatagramSocket對象
DatagramSocket socket = new DatagramSocket();
// 向服務器端發送數據報
socket.send(packet);
// 接收服務器端響應的數據
// 1、創建數據報 用於接收服務器端響應的數據
byte[] data2 = new byte[1024];
DatagramPacket packet2 = new DatagramPacket(data2, data2.length);
// 2/接收服務器響應的數據
socket.receive(packet2);
// 3、讀取數據
String reply = new String(data2, 0, packet2.getLength());
System.out.println("我是客戶端,服務器端說:"+reply);
// 關閉資源
socket.close();
}
服務器端————
/1、服務器端實現步驟 創建DatagramSocket指定端口號 2、創建DatagramPacket
// 3、接受客戶端發送的數據信息 4、讀取數據
public static void main(String[] args) throws IOException {
try {
// 接收客戶端發送的數據
// 創建服務器端DatagramSocket 指定端口
DatagramSocket socket = new DatagramSocket(8800);
// 創建數據報 用於接受客戶端發送的數據
byte[] data = new byte[1024];
DatagramPacket packet = new DatagramPacket(data, data.length);
// 接收客戶端發送的數據
System.out.println("我是服務器啓動 等待客戶端。。。");
socket.receive(packet); //此方法在接收到數據報之前會一直阻塞
// 讀取數據
String info = new String(data, 0, packet.getLength());
System.out.println("我是服務器,客戶端說"+info);
// 向客戶端相應數據
// 定義客戶端的地址、端口號、數據
InetAddress address = packet.getAddress();
int port = packet.getPort();
byte[] data2 ="歡迎 !".getBytes();
// 創建數據報 包含相應的數據信息
DatagramPacket packet2 = new DatagramPacket(data2, data2.length, address, port);
// 響應客戶端
socket.send(packet2);
// 關閉資源
socket.close();
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}