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