主要是实现两个程序间的信息交流,客服端发送请求,服务器监听到请求则响应客服端请求
UDP
特点:
UDP是一个无连接协议,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。无连接,不安全效率高
java编程步骤:
客服端:
- 创建Socket对象,使用DatagramSocket
- 创建数据包。使用DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 发送数据。使用send(DatagramPacket p)
- 释放资源 。使用close()
注意:
DatagramPacket(byte[] buf, int length, InetAddress address, int port) 此方法的传输的数据为byte[],可有String.getBytes();得到
需要指定接受端的IP地址对象 InetAddress,如InetAddress.getByName(“本机名称");//当前设备
服务器端:
- 创建Soket对象,使用DatagramSocket(int port) 需要指定端口号
- 接受数据包。使用receive(DatagramPacket p)
- 解析数据包。调用DatagramPacket数据包中的get方法
- 输出数据
- 关闭连接
注意:
- 创建服务器Socket时需要指定端口号,且端口号要与客服端数据包中端口号一致
- 调用receive(DatagramPacket p)方法会阻塞线程,其中参数用此方法构造DatagramPacket(byte[] buf, int length) 构造一个 DatagramPacket用于接收长度的数据包 length 。
实例:
客服端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPSend {
public static void main(String[] args) throws IOException {
//method();
//创建socket
DatagramSocket ds=new DatagramSocket();
//创建数据包
byte[] data="hello world!".getBytes();
DatagramPacket dp=new DatagramPacket(data, data.length, InetAddress.getByName("DESKTOP-NFHEV8O"), 10086);
//发送数据包
ds.send(dp);
//释放资源
ds.close();
}
static void method() throws IOException {
// 1.创建Socket对象
DatagramSocket dgs = new DatagramSocket();
// 2.打包数据
String str = "hello udp";
byte[] data = str.getBytes();
int len = data.length;
InetAddress address = InetAddress.getByName("DESKTOP-NFHEV8O");//当前设备
int port = 10086;
DatagramPacket dp = new DatagramPacket(data, len, address, port);
// 3.发送数据
dgs.send(dp);
// 4.关闭连接
dgs.close();
}
}
服务器端:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
public class UDPReceive {
public static void main(String[] args) throws IOException {
//method();
//创建socket对象
DatagramSocket ds=new DatagramSocket(10086);
//接收数据包
byte[] bys=new byte[1024];
DatagramPacket dp=new DatagramPacket(bys,bys.length);
ds.receive(dp);
//解析数据
InetAddress address=dp.getAddress();//获取发送端地址
byte[] data=dp.getData();
int len=dp.getLength();
//显示数据
System.out.println("hostAddress------>"+address);
System.out.println(new String(data,0,len));
//释放资源
ds.close();
}
static void method() throws SocketException, IOException {
// 1.创建Soket对象
DatagramSocket ds=new DatagramSocket(10086);//指定端口
// 2.接受数据包
byte[] by=new byte[1024];
DatagramPacket dp=new DatagramPacket(by,by.length);
System.out.println(1);
ds.receive(dp);
System.out.println(2);
// 3.解析数据包
byte[] data=dp.getData();
int datalen=dp.getLength();//获取数据的实际长度
InetAddress address=dp.getAddress();
// 4.输出数据
System.out.println("hostaddress---->"+address);
//String(byte[] bytes, int offset, int length)
//通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
System.out.println(new String(data,0,datalen));
// 5.关闭连接
ds.close();
}
}
TCP
特点:
TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式: [1]
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
有链接,安全,效率低
java编程步骤:
客服端:
TCP发送数据步骤:
1.创建Socket对象。使用Socket(InetAddress address, int port) 创建流套接字并将其连接到指定IP地址的指定端口号。
2.获取输出流。使用getOutputStream() 返回此套接字的输出流。
3.发送数据。使用输出流直接发送输出数据
4.释放资源。使用close(),关闭Socket会自动关闭输出流
服务器端:
TCP接受数据步骤:
1.创建Socket对象。使用ServerSocket(int port) 创建绑定到指定端口的服务器套接字。
2.监听,等待客服端发送请求。accept() 侦听要连接到此套接字并接受它。返回值为客服端Socket对象
3.获取输入流对象
4.输出数据
5.释放资源
注意:
- tcp发送数据前 首先建立连接
- 实质是输入输出流收发数据
实例:
客服端:
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
// * 1.创建Socket对象
Socket s=new Socket(InetAddress.getByName("DESKTOP-NFHEV8O"),10086);
// * 2.获取输出流
OutputStream os=s.getOutputStream();
// * 3.发送数据
byte[] data="hello tcp,im comming!".getBytes();
os.write(data);
// * 4.释放资源
//os.close(); //关闭socket会自动管不输出流
s.close();
}
}