TCP
TCP :一种面向连接(连接导向)的,可靠的,基于字节流的运输层,通讯协议
特点: 面向连接,
点到点的通信
高可靠性
占用系统资源多,效率低
UDP: 一种无连接的传输层协议,提供面向事务的简单不可靠信息传世服务
特点: 非面向连接,传输不可靠,可能丢失
发送不管对方是否准备好,接收方收到也不确认
可以广播发送
非常简单的协议,开销小
套接字Socket
我们开发的网络应用程序位于应用层,TCP和UDP 属于传输层协议
在应用层如何使用传输层的服务呢?
在应用层和传输层之间,则是使用套接字来进行分离
套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据,而这个小口以内,也就是数据进入这个口之后,或者数据从这个口出来之前,是不知道也不需要知道的,也不会关心他如何传输,这属于网络其他层次的工作
UDP编程
UDP发送端
package UDP编程;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
* 发送端
* 1.使用DatagramSocket 指定端口创建发送端
* 2.准备数据容器,一定转换成字节数组,
* 3.封装成DatagramPacket包裹,需要指定目的地
* 4.发送包裹send(DatagramPacket p)
* 5.释放资源
* @author T011921
*
*/
public class UdpClient {
public static void main(String[] args) throws Exception {
System.out.println("发送方启动中。。。");
// * 1.使用DatagramSocket 指定端口 创建发送端
DatagramSocket client = new DatagramSocket(8888);
// * 2.准备数据容器,一定转换成字节数组,
String data = "武汉加油,中国加油";
byte[] datas = data.getBytes();
// * 3.封装成DatagramPacket包裹,需要指定目的地
DatagramPacket packet = new DatagramPacket(datas,0,datas.length,
new InetSocketAddress("localhost",9999));
// * 4.发送包裹send(DatagramPacket p)
client.send(packet);
// * 5.释放资源
client.close();
}
}
UDP接收端
package UDP编程;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 接收端
* 1.使用DatagramSocket 指定端口创建接收端
* 2.准备容器,封装成DatagramPacket包裹
* 3.阻塞式接收包裹receive(DatagramPacket p)
* 4.分析数据
* byte[] getData()
* getLength()
*
* @author T011921
*
*/
public class UdpServer {
public static void main(String[] args) throws Exception {
System.out.println("接收方接收中");
// * 1.使用DatagramSocket 指定端口创建接收端
DatagramSocket server = new DatagramSocket(9999);
// * 2.准备容器,封装成DatagramPacket包裹
byte[] container = new byte[1024*60];
DatagramPacket packet = new DatagramPacket(container,0,container.length);
// * 3.阻塞式接收包裹receive(DatagramPacket p)
server.receive(packet);
// * 4.分析数据
// * byte[] getData()
// * getLength()
byte[] datas = packet.getData();
int len = packet.getLength();
System.out.println(new String(datas,0,len));
// 5.释放资源
server.close();
}
}
TCP编程
TCP客户端
package TCP编程;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 熟悉流程
* 创建客户端服务器
* 1.建立连接,使用Socket创建客户端+服务的地址和端口
* 2.操作:输入输出流操作
* 3.释放资源
*
*/
public class Client {
public static void main(String[] args) throws Exception, IOException {
System.out.println("-------------clent------");
// * 1.建立连接,使用Socket创建客户端+服务的地址和端口
Socket client = new Socket("localhost",8888);
// * 2.操作:输入输出流操作
DataOutputStream dos = new DataOutputStream(client.getOutputStream());
String data = "hello";
dos.writeUTF(data);
// * 3.释放资源
dos.close();
client.close();
}
}
TCP服务端
package TCP编程;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
* 熟悉流程
* 创建服务器
* 1.指定端口,使用ServerSocket创建服务器
* 2.阻塞式等待连接 accept
* 3.操作:输入输出流操作
* 4.释放资源
*
*/
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("-------------server------");
// * 1.指定端口,使用ServerSocket创建服务器
ServerSocket server =new ServerSocket(8888);
// * 2.阻塞式等待连接 accept
Socket client = server.accept();
System.out.println("一个客户端建立了连接");
// * 3.操作:输入输出流操作
DataInputStream dis = new DataInputStream(client.getInputStream());
String data = dis.readUTF();
System.out.println(data);
// * 4.释放资源
dis.close();
client.close();
server.close();
}
}
来源:CSDN
作者:weixin_43865196
链接:https://blog.csdn.net/weixin_43865196/article/details/104166707