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
