– TCP协议——面向连接的协议,确保可靠的通讯
– UDP协议——无连接协议,每一个datagram都是独立的,且先后顺序无关
– UDP协议——无连接协议,每一个datagram都是独立的,且先后顺序无关
Java.net包
– TCP协议
• URL
• URLConnection
• Socket
• ServerSocket
– TCP协议
• URL
• URLConnection
• Socket
• ServerSocket
http 基于TCP
– UDP协议
• DatagramPacket
• DatagramSocket 点对点
• MulticastSocket 广播
– UDP协议
• DatagramPacket
• DatagramSocket 点对点
• MulticastSocket 广播
连接服务器端并读写
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try ( Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader( new
InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader( new
InputStreamReader(System.in)) )
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput); System.out.println("echo: " + in.readLine());
}
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
try ( Socket echoSocket = new Socket(hostName, portNumber);
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader( new
InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader( new
InputStreamReader(System.in)) )
String userInput;
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput); System.out.println("echo: " + in.readLine());
}
主要步骤
– 设置连接的host及端口
– 获取输入输出流
– 从输入流中读取
– 从输出流中写入
– 设置连接的host及端口
– 获取输入输出流
– 从输入流中读取
– 从输出流中写入
服务器端主要步骤
– 绑定端口
– 接受客户端连接
– 获取输入输出流
– 从输入流中读取
– 从输出流中写入
int portNumber = Integer.parseInt(args[0]);
try ( ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader( new
InputStreamReader(clientSocket.getInputStream())); ) {
– 绑定端口
– 接受客户端连接
– 获取输入输出流
– 从输入流中读取
– 从输出流中写入
int portNumber = Integer.parseInt(args[0]);
try ( ServerSocket serverSocket = new ServerSocket(portNumber);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(),
true);
BufferedReader in = new BufferedReader( new
InputStreamReader(clientSocket.getInputStream())); ) {
UDP客户端
public class QuoteClient {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.out.println("Usage: java QuoteClient <hostname>");
return;
} // get a datagram socket
DatagramSocket socket = new DatagramSocket(); // send request
byte[] buf = new byte[256];
InetAddress address = InetAddress.getByName(args[0]);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
socket.send(packet); // get response
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); // display response
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Quote of the Moment: " + received); socket.close();
}
}
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.out.println("Usage: java QuoteClient <hostname>");
return;
} // get a datagram socket
DatagramSocket socket = new DatagramSocket(); // send request
byte[] buf = new byte[256];
InetAddress address = InetAddress.getByName(args[0]);
DatagramPacket packet = new DatagramPacket(buf, buf.length, address, 4445);
socket.send(packet); // get response
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); // display response
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Quote of the Moment: " + received); socket.close();
}
}
主要步骤
– 创建DatagramSocket
– 获取服务器地址
– 创建需要发送的内容(DatagramPacket),同时设置地址及端口
– 通过DatagramSocket发送DatagramPacket
注意
– UDP通讯是不可靠的,因此可能丢包
– UDP通讯速度很快
– 创建DatagramSocket
– 获取服务器地址
– 创建需要发送的内容(DatagramPacket),同时设置地址及端口
– 通过DatagramSocket发送DatagramPacket
注意
– UDP通讯是不可靠的,因此可能丢包
– UDP通讯速度很快
UDP 服务端
public class QuoteServerThread extends Thread {
protected DatagramSocket socket = null;
protected BufferedReader in = null;
protected boolean moreQuotes = true;
public QuoteServerThread() throws IOException { this("QuoteServerThread"); }
public QuoteServerThread(String name) throws IOException {
super(name); socket = new DatagramSocket(4445);
try { in = new BufferedReader(new FileReader("one-liners.txt")); }
catch (FileNotFoundException e) { System.err.println("Could not open quote file. Serving time instead."); }
}
public void run() {
while (moreQuotes) {
try { byte[] buf = new byte[256]; // receive request
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); // figure out response
String dString = null;
if (in == null) dString = new Date().toString(); else dString = getNextQuote();
buf = dString.getBytes(); // send the response to the client at "address" and "port"
InetAddress address = packet.getAddress(); int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
} catch (IOException e) { e.printStackTrace(); moreQuotes = false; }
} socket.close();
}
protected DatagramSocket socket = null;
protected BufferedReader in = null;
protected boolean moreQuotes = true;
public QuoteServerThread() throws IOException { this("QuoteServerThread"); }
public QuoteServerThread(String name) throws IOException {
super(name); socket = new DatagramSocket(4445);
try { in = new BufferedReader(new FileReader("one-liners.txt")); }
catch (FileNotFoundException e) { System.err.println("Could not open quote file. Serving time instead."); }
}
public void run() {
while (moreQuotes) {
try { byte[] buf = new byte[256]; // receive request
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet); // figure out response
String dString = null;
if (in == null) dString = new Date().toString(); else dString = getNextQuote();
buf = dString.getBytes(); // send the response to the client at "address" and "port"
InetAddress address = packet.getAddress(); int port = packet.getPort();
packet = new DatagramPacket(buf, buf.length, address, port);
socket.send(packet);
} catch (IOException e) { e.printStackTrace(); moreQuotes = false; }
} socket.close();
}
}
主要步骤
– 创建DatagramSocket,并绑定端口
– 通过DatagramPacket读取输入,写入输出
– 创建DatagramSocket,并绑定端口
– 通过DatagramPacket读取输入,写入输出
创建一个URL
new URL("http://www.ibm.com");
直接从URL读取信息
public class URLReader {
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://www.oracle.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
new URL("http://www.ibm.com");
直接从URL读取信息
public class URLReader {
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://www.oracle.com/");
BufferedReader in = new BufferedReader(
new InputStreamReader(oracle.openStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
连接URL
try {
URL myURL = new URL("http://example.com/");
URLConnection myURLConnection = myURL.openConnection();
myURLConnection.connect();
} catch (MalformedURLException e) {
// new URL() failed // ...
} catch (IOException e) {
// openConnection() failed // ...
}
try {
URL myURL = new URL("http://example.com/");
URLConnection myURLConnection = myURL.openConnection();
myURLConnection.connect();
} catch (MalformedURLException e) {
// new URL() failed // ...
} catch (IOException e) {
// openConnection() failed // ...
}
通过URLConnection读取及写入
– 读取
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://www.oracle.com/");
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
– 读取
public class URLConnectionReader {
public static void main(String[] args) throws Exception {
URL oracle = new URL("http://www.oracle.com/");
URLConnection yc = oracle.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(
yc.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null)
System.out.println(inputLine);
in.close();
}
}
– 写入
public class Reverse {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: java Reverse " + "http://<location of your servlet/script>" + "
string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[1], "UTF-8");
URL url = new URL(args[0]); URLConnection connection = url.openConnection();
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter( connection.getOutputStream());
out.write("string=" + stringToReverse);
out.close();
BufferedReader in = new BufferedReader( new InputStreamReader( connection.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {
System.out.println(decodedString); } in.close(); } }
public class Reverse {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: java Reverse " + "http://<location of your servlet/script>" + "
string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[1], "UTF-8");
URL url = new URL(args[0]); URLConnection connection = url.openConnection();
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter( connection.getOutputStream());
out.write("string=" + stringToReverse);
out.close();
BufferedReader in = new BufferedReader( new InputStreamReader( connection.getInputStream()));
String decodedString;
while ((decodedString = in.readLine()) != null) {
System.out.println(decodedString); } in.close(); } }
高级网络编程底层仍然通过Socket进行通讯,但上层封装了不同的协议
– CORBA
– RMI
– Web service
– JMS
– ZeroMQ
– CORBA
– RMI
– Web service
– JMS
– ZeroMQ
RMI
Java自有的网络协议
通过RMI/IIOP支持CORBA
为Java EE的EJB通讯协议
属于局域网协议
二进制编码,效率较高
不需要Java EE服务器或web服务器
Java自有的网络协议
通过RMI/IIOP支持CORBA
为Java EE的EJB通讯协议
属于局域网协议
二进制编码,效率较高
不需要Java EE服务器或web服务器
Web Service
最早的web service协议是基于SOAP的XML编码协议
可支持Internet编程
不受防火墙限制
可直接通过HTTP协议传输
支持内容加密、签名以及HTTPS协议
已经不局限于SOAP,支持包括RESTful等多种形式
为SOA、 ESB的基础
运行于Java EE服务器中
最早的web service协议是基于SOAP的XML编码协议
可支持Internet编程
不受防火墙限制
可直接通过HTTP协议传输
支持内容加密、签名以及HTTPS协议
已经不局限于SOAP,支持包括RESTful等多种形式
为SOA、 ESB的基础
运行于Java EE服务器中
JMS
Java自有的协议
– 支持点对点通讯
– 支持订阅、广播方式通讯
– 可设置过滤器,支持订阅部分信息
– 可支持消息持久化
– ActiveMQ支持多种语言,包括Java、 C++、 .NET
– 需要支持JMS的中间件
Java自有的协议
– 支持点对点通讯
– 支持订阅、广播方式通讯
– 可设置过滤器,支持订阅部分信息
– 可支持消息持久化
– ActiveMQ支持多种语言,包括Java、 C++、 .NET
– 需要支持JMS的中间件
ZeroMQ
不是中间件,而是直接提供底层支持,不需要中间件进行通讯
支持多种消息交换模式
– 请求、应答
– 订阅、广播
– 推拉模式
支持包括Java在内的多种编程语言
不是中间件,而是直接提供底层支持,不需要中间件进行通讯
支持多种消息交换模式
– 请求、应答
– 订阅、广播
– 推拉模式
支持包括Java在内的多种编程语言