TCP/IP协议
传输控制协议,是一个可靠的互联网安全协议,需要主机之间先建立正确的连接,才能够进行通信,且TCP/IP协议可以保证数据传输的稳定性,保证信息需要发送到一台主机,该主机确认信息之后才能发送下一条信息,其次,TCP/IP协议也可以保证信息传输的有序性即先发送的信息一定先到达。一般基于C/S架构,存在服务器客户端模式。,接下来简单简单的模拟一下。
/**
* 模拟服务端
*/
public class Server {
public static void main(String[] args) throws IOException {
//在2345端口创建服务
ServerSocket server = new ServerSocket(2345);
System.out.println("服务器已启动...");
//开启服务等待客户端连接
Socket s = server.accept();
System.out.println("客户端连接:"+s.getInetAddress().getHostAddress());
//获取基于Socket的输出流并包装为打印流
MsgUtils.sendMsg(s.getOutputStream(),"TCP/IP协议");
//获取标准输入流文本扫描对象
Scanner sc = new Scanner(System.in);
//开启循环通信
while(true) {
//接收消息
String msg = MsgUtils.readLine(s.getInputStream());
System.out.println("client:"+msg);
//发送消息
msg = sc.nextLine();
MsgUtils.sendMsg(s.getOutputStream(), msg);
}
}
}
/**
* 消息工具类
* 包含对消息读写的相关操作
*/
public class MsgUtils {
/**
* 将字节流以一行文本返回
* @param is
* @return
* @throws IOException
*/
public static String readLine(InputStream is) throws IOException {
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String msg = br.readLine();
return msg;
}
/**
* 通过输出流发送文本消息
* @param os
* @param msg
*/
public static void sendMsg(OutputStream os,String msg) {
PrintWriter pw = new PrintWriter(os);
pw.println(msg);
pw.flush();
}
}
/**
* 模拟客户端
*/
public class Client {
public static void main(String[] args) throws UnknownHostException, IOException {
//连接到指定地址指定端口的服务
Socket s = new Socket("192.168.7.141",2345);
//获取标准输入流文本扫描对象
Scanner sc = new Scanner(System.in);
//开启循环通信
while(true) {
//接收消息
String msg = MsgUtils.readLine(s.getInputStream());
System.out.println("server:"+msg);
//发送消息
msg = sc.nextLine();
MsgUtils.sendMsg(s.getOutputStream(), msg);
}
}
}
运行结果:
先启动服务器端
客户端启动,接收到服务器端发送的消息
并且服务器端显示连接客户端信息
UDP协议
UDP协议又称用户数据报协议,是一个不安全的互联网协议,不需要双方之间建立联系,传输效率更搞,没有服务器和客户端,只有发送端和接收端。再看一个小例子。
/**
* 模拟广播发送端
*/
public class BoradastSender {
public static void main(String[] args) throws IOException {
//创建一个广播通道
MulticastSocket ms = new MulticastSocket();
//获取广播地址(D类地址)
InetAddress addr = InetAddress.getByName("228.5.6.7");
//将通道加入组播地址
ms.joinGroup(addr);
String msg = "UDP协议";
DatagramPacket dp = new DatagramPacket(
msg.getBytes(),
msg.getBytes().length,
addr,
5555);
ms.send(dp);
ms.close();
}
}
/**
* 模拟接收端
*/
public class BoradcastReceier {
public static void main(String[] args) throws IOException {
MulticastSocket ms = new MulticastSocket(5555);
InetAddress addr = InetAddress.getByName("228.5.6.7");
//将通道加入组播地址
ms.joinGroup(addr);
byte[] b = new byte[1024];
DatagramPacket dp = new DatagramPacket(b,b.length);
System.out.println("准备接收通知");
while(true) {
ms.receive(dp);
int len = dp.getLength();
String ip = dp.getAddress().getHostAddress();
String s = new String(b,0,len);
System.out.println("接受到来自" + ip +"的通知的消息通道" + s);
}
}
}
运行结果:
启动接收端
发送端启动,接收端接受到消息
总结
综合上述的两个小案例的对比,TCP/IP协议模拟仅是服务器向一台客户端发送消息,且需要客户端连接到服务器双方确认建立连接之后才能发送消息,而UDP协议发送端只需将需要发送的消息打包发送即可,并不需要确认接收方是谁或者是否存在,不需要服务器的存在,也并不会保证消息到达的时间和顺序,所以相比之下TCP/IP协议显得更加安全可靠,但是相对耗时更长更复杂,这也是我们在开发过程中最常见的问题之一:对于空间和时间的取舍。所以在实际开发过程中对于技术的选择要综合多方面的需求来进行考虑分析使用哪种技术是最佳方案。