通讯,源于网络,网络从下到上,分为7层:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层;通讯,基于协议,常用的协议有很多,比如网络层协议IP、传输层协议TCP/UDP、应用层协议HTTP/SOAP/REST等。
我们还会经常听到Socket,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口。有个形象的比喻:HTTP是轿车,提供了封装或者显示数据的具体形式;Socket是发动机,提供了网络通信的能力。
任何语言,都会提供对通讯的支持,我们今天用Java语言,演示几种在Java中比较常用的通讯技术,包括:Socket、Http、REST、Dubbo、Thrift、FTP。
SocketServer.java
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; public class SocketServer { public static void main(String[] args) { SocketServer ss = new SocketServer(); //设定服务端的端口号 ServerSocket s = null; try { s = new ServerSocket(10099); System.out.println("ServerSocket Start:"+s); while(true) { Socket socket = s.accept(); //这个地方是阻塞的 System.out.println("Server_Accept:"+socket); SocketServer.HandleSocket vsm = ss.new HandleSocket(socket); new Thread(vsm).start(); } } catch (IOException e) { e.printStackTrace(); } finally { try { s.close(); } catch (IOException e) { } } } class HandleSocket implements Runnable { private Socket socket; public HandleSocket(Socket socket) { this.socket = socket; } @Override public void run() { BufferedReader br = null; PrintWriter pw = null; try { //用于接收客户端发来的请求 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); //用于发送返回信息,可以不需要装饰这么多io流使用缓冲流时发送数据要注意调用.flush()方法 pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())),true); String str = br.readLine(); if(str != null) { pw.println("OK_"+Thread.currentThread().getName()); pw.flush(); System.out.println("Command:"+str); } } catch (Exception e) { e.printStackTrace(); }finally{ System.out.println("Server_Close:"+socket); try { br.close(); pw.close(); socket.close(); } catch (Exception e2) { } } } } }
SocketClient.java
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class SocketClient { public static void main(String[] args) throws InterruptedException { for(int i=0;i<10;i++) { call( "Hello" + i); } } public static void call(String command) { Socket socket = null; BufferedReader br = null; PrintWriter pw = null; try { //客户端socket指定服务器的地址和端口号 socket = new Socket("127.0.0.1", 10099); System.out.println("Client_Open" + socket + " Command:" + command); //同服务器原理一样 br = new BufferedReader(new InputStreamReader(socket.getInputStream())); pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()))); pw.println(command); pw.flush(); String str = br.readLine(); System.out.println("Client_Receive:"+str); } catch (Exception e) { e.printStackTrace(); } finally { try { System.out.println("Client_Close:"+socket); br.close(); pw.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } } }
HttpConnection演示:HttpConnectionTest.java
import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; public class HttpConnectionTest { public static void main(String[] args) throws Exception { System.out.println("begin send"); String inputParam = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><content>Test</content></page>"; URL url = null; HttpURLConnection httpConn = null; OutputStream output = null; OutputStreamWriter outr = null; //url = new URL("http://127.0.0.1:8888/iotest/ReadServlet"); url = new URL("http://www.baidu.com"); httpConn = (HttpURLConnection) url.openConnection(); httpConn.setConnectTimeout(30000); httpConn.setReadTimeout(30000); HttpURLConnection.setFollowRedirects(true); httpConn.setDoOutput(true); httpConn.setRequestMethod("POST"); httpConn.setRequestProperty("Content-Type", "text/xml"); httpConn.connect(); output = httpConn.getOutputStream(); outr = new OutputStreamWriter(output); // 写入请求参数 outr.write(inputParam.toString().toCharArray(), 0, inputParam.toString().length()); outr.flush(); outr.close(); System.out.println("send ok"); int code = httpConn.getResponseCode(); System.out.println("code " + code); System.out.println(httpConn.getResponseMessage()); //读取响应内容 String sCurrentLine = ""; String sTotalString = ""; if (code == 200) { java.io.InputStream is = httpConn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); while ((sCurrentLine = reader.readLine()) != null) if (sCurrentLine.length() > 0) sTotalString = sTotalString + sCurrentLine.trim(); } else { sTotalString = "远程服务器连接失败,错误代码:" + code; } System.out.println("response:" + sTotalString); } }
...待续
...待续
...待续
...待续
原文:http://blog.csdn.net/puma_dong/article/details/44547131