UDP
- UDP是网络传输层协议,面向无连接,不可靠,不保证数据能够准确无误的传输,但是效率高。
- 因为UDP是无连接的协议,客户端的DatagramSocket与服务器端的DatagramSocket不存在一一对应的关系,两者无需建立连接,就能交换数据报。
- DatagramSocket提供了接收和发送数据报的方法:
1. 接收数据报:public void receive(DatagramPacket dst)throws IOException
2. 发送数据报:public void send(DatagramPacket src)throws IOEception - 以下举一个例子来说明:只能是客户机向服务器单项发送消息。
Client类
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ClientOne {
private int port = 8080;
public static void main(String[] args) throws IOException {
new ClientOne().send();
}
private void send() throws IOException {
DatagramSocket socket = new DatagramSocket();
while (true){
Scanner input = new Scanner(System.in);
String context = input.nextLine();
socket.connect(InetAddress.getByName("localhost"),port);
byte[] bytes = context.getBytes();
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
socket.send(packet);
System.out.println("echo:"+context);
if (context.equals("bye")){
break;
}
}
}
}
Server类
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.lang.*;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ServerOne {
DatagramSocket socket;
private int port = 8080;
DatagramPacket packet;
public static void main(String[] args) throws IOException {
ServerOne server = new ServerOne();
server.receive();
}
private void receive() throws IOException {
socket = new DatagramSocket(port);
byte[] b = new byte[100];
while (true){
packet = new DatagramPacket(b,b.length);
socket.receive(packet);
byte[] data = packet.getData();
System.out.println(new String(data));
if (new String(data).equals("bye")){
break;
}
}
}
}
双向聊天的基于UDP协议
Server类
import java.lang.*;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ServerOne {
static DatagramSocket socket;
private int port = 8080;
static DatagramPacket packet;
public static void main(String[] args) throws IOException {
new ServerOne().service();
}
private void service() throws IOException {
socket = new DatagramSocket(port);
while (true) {
receive();
send();
}
}
private void send() throws IOException {
Scanner input = new Scanner(System.in);
String context = input.nextLine();
System.out.println("server:" + context);
byte[] bytes = context.getBytes();
packet.setData(bytes, 0, bytes.length);
socket.send(packet);
if (context.equals("bye")) {
return;
}
}
private void receive() throws IOException {
byte[] b = new byte[100];
packet = new DatagramPacket(b, b.length);
socket.receive(packet);
byte[] data = packet.getData();
System.out.println("client:" + new String(data));
if (new String(data).equals("bye")) {
return;
}
}
}
Client类
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class ClientOne {
static DatagramSocket socket;
private int port = 8080;
static DatagramPacket packet;
public static void main(String[] args) throws IOException {
new ClientOne().service();
}
private void service() throws IOException {
socket = new DatagramSocket();
while (true) {
send();
receive();
}
}
private void send() {
Scanner input = new Scanner(System.in);
String context = input.nextLine();
byte[] bytes = context.getBytes();
try {
socket.connect(InetAddress.getByName("localhost"), port);
} catch (UnknownHostException e) {
e.printStackTrace();
}
packet = new DatagramPacket(bytes, bytes.length);
try {
socket.send(packet);
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("client:" + context);
if (context.equals("bye")) {
return;
}
}
private void receive() {
byte[] b = new byte[100];
packet = new DatagramPacket(b, 0, b.length);
try {
socket.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
byte[] data = packet.getData();
System.out.println("server:" + new String(data));
if (new String(data).equals("bye")) {
return;
}
}
}
运行出来的效果