UDP
将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。
UDP协议发送和接收数据图解
接收端的代码:
package UDP数据接收与发送;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP协议接收数据:
* A:创建接收端Socket对象
* B:创建一个数据包(接收容器)
* C:调用Socket对象的接收方法接收数据
* D:解析数据包,并显示在控制台
* E:释放资源
*/
public class ReceiveDemo {
public static void main(String[] args) throws IOException {
// 创建接收端Socket对象
DatagramSocket ds = new DatagramSocket(10086);
// 创建一个数据包(接收容器)
byte[] bys = new byte[1024];
int length = bys.length;
DatagramPacket dp = new DatagramPacket(bys, length);
// 调用Socket对象的接收方法接收数据
ds.receive(dp);// 阻塞方法
// 解析数据包,并显示在控制台
InetAddress ia = dp.getAddress();
String ip = ia.getHostAddress();
byte[] bys2 = dp.getData();
int len = dp.getLength();
String s = new String(bys2, 0, len);
System.out.println(ip + "发来数据:" + s);
// 释放资源
ds.close();
}
}
发送端的代码:
package UDP数据接收与发送;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* UDP协议接收数据:
* A:创建发送端Socket对象
* B:创建一个数据包(发送容器)
* C:调用Socket对象的发送方法接收数据
* E:释放资源
*/
public class SendDemo {
public static void main(String[] args) throws IOException {
// 创建发送端Socket对象
DatagramSocket ds = new DatagramSocket();
// 创建一个数据包(发送容器)
byte[] bys = ("hello,DUP,我来了").getBytes();
int length = bys.length;
InetAddress address = InetAddress.getByName("59.71.66.152");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bys, length, address, port);
// 调用Socket对象的发送方法接收数据
ds.send(dp);
// 释放资源
// ds.close();
}
}
TCP
建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过三次握手完成连接,是可靠协议;必须建立连接,效率会稍低
TCP协议发送和接收数据图解
服务器端代码:
package TCP数据发送与接收;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class ServerDemo {
public static void main(String[] args) throws IOException {
// 创建接收端的套接字对象
ServerSocket ss = new ServerSocket(8888);
// 监听客户端连接,返回相应的Socket对象
Socket s = ss.accept();
// 获取输入流对象,从输入流中获取数据
InputStream is = s.getInputStream();
byte[] bys = new byte[1024];
int len = is.read(bys);
String str = new String(bys, 0, len);
System.out.println("From Client" + "(" + s.getInetAddress().getHostAddress() + "):" + str);
// 释放资源
s.close();
}
}
客户端代码:
package TCP数据发送与接收;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class ClientDemo {
public static void main(String[] args) throws IOException {
// 创建Socket套接字对象
Socket s = new Socket("59.71.66.152", 8888);
// 获取输出流对象,写数据
OutputStream os = s.getOutputStream();
os.write("hello,世界".getBytes());
// 释放资源
s.close();
}
}