大数据工程师:大数据的java基础 第十二周

来源:互联网 发布:淘宝客怎么贷款 编辑:程序博客网 时间:2024/06/14 16:23
– TCP协议——面向连接的协议,确保可靠的通讯
– UDP协议——无连接协议,每一个datagram都是独立的,且先后顺序无关
Java.net包
– TCP协议
• URL
• URLConnection
• Socket
• ServerSocket
http 基于TCP
– 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());
}

 主要步骤
– 设置连接的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())); ) {

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();
}
}

 主要步骤
– 创建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();
}
}
 主要步骤
– 创建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();
}
}

 连接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 // ...
}

 通过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 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

RMI
 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服务器中

JMS
 Java自有的协议
– 支持点对点通讯
– 支持订阅、广播方式通讯
– 可设置过滤器,支持订阅部分信息
– 可支持消息持久化
– ActiveMQ支持多种语言,包括Java、 C++、 .NET
– 需要支持JMS的中间件

ZeroMQ
 不是中间件,而是直接提供底层支持,不需要中间件进行通讯
 支持多种消息交换模式
– 请求、应答
– 订阅、广播
– 推拉模式
 支持包括Java在内的多种编程语言


0 0
原创粉丝点击