1通過URL對象的openStream()方法能夠得到指定資源的輸入流。
2通過輸入流能夠讀取、訪問網絡上的數據。
案例:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.MalformedURLException; import java.net.URL; public class UrlTest { public static void main(String[] args) { try { URL url = new URL("http://www.baidu.com"); InputStream is = url.openStream(); InputStreamReader isr = new InputStreamReader(is,"utf-8"); 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(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
Socket通信實現步驟
1 創建ServerSocekt和Socket
2 打開連接到Socket的輸入/輸出流
3 依照協議對Socket進行讀寫操作
4關閉輸入輸出流、關閉Socket
基於TCP的Socket通信
client能夠對應,
服務端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("server端即將啟動!!"); Socket socket = serverSocket.accept(); 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("我是server,client說:" + info); } socket.shutdownInput(); OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("歡迎您!!"); pw.flush(); pw.close(); os.close(); br.close(); isr.close(); is.close(); socket.close(); serverSocket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }client:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.net.UnknownHostException; public class Client { public static void main(String[] args) { try { Socket socket = new Socket("localhost",8888); OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("username:admin;password:123"); 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("我是client。server說:" + info); } br.close(); is.close(); pw.close(); os.close(); socket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
多線程server與多client通信:
基本實現步驟:
1 server端創建ServerSocket,循環調用accept()等待client連接
2 client創建一個socket並請求和服務端連接
3 服務端接受client請求,創建socket與客戶建立專線連接
4 建立連接的兩個socket在一個單獨的線程對話
5 server端繼續等待新的連接
案例:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; public class ServerThread extends Thread{ 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("我是server。client說:" + info); } socket.shutdownInput(); os = socket.getOutputStream(); pw = new PrintWriter(os); pw.write("歡迎您!。"); 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(); } catch (IOException e) { e.printStackTrace(); } } // serverSocket.close(); } }
服務端:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; public class Server { public static void main(String[] args) { try { ServerSocket serverSocket = new ServerSocket(8888); Socket socket = null; int count = 0; System.out.println("server端即將啟動!!"); while(true){ socket = serverSocket.accept(); ServerThread serverThread = new ServerThread(socket); serverThread.start(); count++; System.out.println("client連接數量:" + count); InetAddress address = socket.getInetAddress(); System.out.println("當前client的IP:" + address); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
client同上。
UDP
DatagramPacket:表示數據報包
DatagramSocket:進行端到端通信的類
基於UDP的Socket編程
服務端:
package com.hpu.lianxi; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UDPServer { public static void main(String[] args) throws IOException { DatagramSocket socket = new DatagramSocket(8800); byte[] data = new byte[1024]; System.out.println("server已經啟動,等待client發送數據****"); DatagramPacket packet = new DatagramPacket(data,data.length); socket.receive(packet); String info = new String(data,0,packet.getLength()); System.out.println("這是服務端,client說:" + info); InetAddress address = packet.getAddress(); int port = packet.getPort(); byte[] data2 = "歡迎您!client:。".getBytes(); DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port); socket.send(packet2); socket.close(); } }
package com.hpu.lianxi; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; public class UDPClient { public static void main(String[] args) throws IOException { InetAddress address = InetAddress.getByName("localhost"); int port = 8800; byte[] data = "username:admin;password:123".getBytes(); DatagramPacket packet = new DatagramPacket(data, data.length,address,port); DatagramSocket socket = new DatagramSocket(); socket.send(packet); byte[] data2 = new byte[1024]; DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port); socket.receive(packet2); String reply = new String(data2,0,packet2.getLength()); System.out.println("我是client,server說:" + reply); socket.close(); } }
多線程的優先級
假設不設置優先級可能會導致執行時速度很慢,可減少優先級
輸入流與輸出流的關閉
對於同一個socket,假設關閉了輸出流。則與該輸出流關聯的socket也會被關閉,所以一般不用
關閉流,直接關閉socket就可以
- 本文已收錄於下面專欄:
- java