通讯,源于网络,网络从下到上,分为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