1通過URL對象的openStream()方法能夠得到指定資源的輸入流。


通過URL讀取網頁內容
    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 = "歡迎您!

。".getBytes(); DatagramPacket packet2 = new DatagramPacket(data2, data2.length,address,port); socket.send(packet2); socket.close(); } }

client:

 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM