Java Sock 網絡 InetAddress

//獲取本機的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 {

// 通過URLopenSream方法獲取URL對象所表示的資源字節輸入

InputStream isurlS.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實現步驟

// 創建ServerSocketSocket  打開連接到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 ossocket.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 addresspacket.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();

}

}

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