Java基础之TCP与UDP
2017-06-16 12:54
183 查看
OSI 7层参考模型
物理层 --> 数据链路层 --> 网络层 --> 传输层 --> 会话层 --> 表示层 --> 应用层按此顺序称为拆包,反之为封包。
TCP/IP参考模型
主机至网络层 --> 网际层 --> 传输层 --> 应用层IP地址:127.0.0.1默认IP,主机名是localhost,每台PC都有的
端口号:应用程序的标识
传输协议:TCP/UDP
UDP:不需建立连接,速度快,不可靠,可能丢包,如对讲机。可以及时通信而不管对方在不在。TCP:需要建立连接。三次握手,效率稍低,可靠。不在后,停止传输。比如打电话,下载数据。
Socket:数据在两个Socket之间通过I/O传输,通信两方都有。
TCP传输中:有一个客户端(client),有一个服务端(server),两方传输经过Socket。Socket是底层建立好了的,既可以输入又可以输出。
UDP传输例子
发送端// 发送端 package Test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; // 实现Runnable并覆盖run方法实现多线程 public class Send implements Runnable { private DatagramSocket ds; // 发送端和接收端都有各自的Socket来传输 public Send(DatagramSocket ds) { this.ds = ds; } @Override public void run() { System.out.println("发送端启动"); try { // 从键盘读入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String line; while ((line = br.readLine()) != null) { // 读到的字符变成字节数组 byte[] buf = line.getBytes(); // 数据打包,传入ip地址和端口 DatagramPacket dp = new DatagramPacket(buf, buf.length, InetAddress.getByName("10.175.214.114"), 10005); // 通过Socket传输数据包 ds.send(dp); // 发送端输入88,就下线 if (line.equals("88")) { System.out.println("退出聊天"); break; } } } catch (IOException e) { e.printStackTrace(); } finally { ds.close(); } } }
接收端
package Test; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class Rec implements Runnable { private DatagramSocket ds; public Rec(DatagramSocket ds) { this.ds = ds; } @Override public void run() { System.out.println("接收端启动"); try { while (true) { byte[] buf = new byte[1024]; DatagramPacket dp = new DatagramPacket(buf, buf.length); // 这个Socket指定端口号,就能收到发送端发过来的数据 ds.receive(dp); // 阻塞式的,等待 String ip = dp.getAddress().getHostAddress(); int port = dp.getPort(); String text = new String(dp.getData(), 0, dp.getLength()); System.out.println(ip + ":" + port + ":" + text); if (text.equals("88")) { System.out.println(ip + ": 退出聊天室"); } } } catch (IOException e) { e.printStackTrace(); } finally { ds.close(); } } }
运行试试
package Test; import java.net.DatagramSocket; import java.net.SocketException; public class UDPDemo { public static void main(String[] args) throws SocketException { // 接收端和发送端有各自的Socket DatagramSocket se = new DatagramSocket(); DatagramSocket re = new DatagramSocket(10005); new Thread(new Rec(re)).start(); new Thread(new Send(se)).start(); } }
TCP传输例子
客户端package Test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class TransClient { public static void main(String[] args) throws IOException { Socket s = new Socket("10.175.160.121", 10003); // 读取键盘输入 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 获取socket输出流,写给服务端 PrintWriter out = new PrintWriter(s.getOutputStream(), true); String line; // socket输入流,读取服务端发来的 BufferedReader bufIn = new BufferedReader(new InputStreamReader(s.getInputStream())); // 从键盘读取后写给服务端 while ((line = br.readLine()) != null) { if (line.equals("over")) break; out.println(line); // 读取服务端发回的大写字母 String uper = bufIn.readLine(); System.out.println(uper); } s.close(); } }
服务端
package Test; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class TransServer { public static void main(String[] args) throws IOException { ServerSocket ss = new ServerSocket(10003); // 接收从客户端发来的socket Socket socket = ss.accept(); // 获取ip String ip = socket.getInetAddress().getHostAddress(); // 获取socket读取流 BufferedReader bufr = new BufferedReader(new InputStreamReader(socket.getInputStream())); // socket输出流,将大写后的写到客户端 PrintWriter out = new PrintWriter(socket.getOutputStream(), true); String line; while ((line=bufr.readLine()) != null) { // 服务端打印从客户端发来的数据 System.out.println(line); // 服务端发送给客户端转化大写后的数据 out.println(line.toUpperCase()); } socket.close(); ss.close(); } }
by @sunhaiyu
2016.1.13
相关文章推荐
- 【黑马程序员】Java基础12:UDP和TCP的网络通讯
- java基础---UDP和TCP
- 计算机网络基础-1.TCP、UDP简单通信java实现
- JAVA基础学习day24--Socket基础一UDP与TCP的基本使用
- java基础----->TCP和UDP套接字编程
- java基础_13_网络协议 (UDP_TCP)
- JAVA基础再回首(二十八)——网络编程概述、IP地址、端口号、TCP和UDP协议、Socket、UDP传输、多线程UDP聊天
- java的基础网络编程:TCP/UDP
- Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】
- Java基础---Java---网络编程---TCP、UDP、UDP-键盘录入方式数据、Socket、TCP复制文件、UDP-聊天
- Java基础 网络编程 Socket UDP TCP URL
- 黑马程序员——JAVA基础---网路编程---概述,UDP/TCP对应Socket,小知识点
- JAVA基础 day25 网络编程 IP类 UDP,TCP传输学习 简易聊天工具 TCP并发学习
- (Java 基础知识)Java TCP和UDP
- Java基础—网络编程【OSI/RM TCP/IP】【网络通信三要素】【UDP传输 & TCP传输】【DNS域名解析】
- Java基础——网络编程(TCP、UDP)
- 黑马程序员---2015.6.27java基础笔记--字符编码--TCP--UDP
- java 基础知识之网络通信(TCP通信、UDP通信、多播以及NIO)总结
- 黑马程序员_毕向东JAVA基础_网络编程(概述&UDP&TCP)
- Java基础23天--05--网络编程(TCP和UDP)