基于UDP的Java网络编程
TCP
- TCP:
- 客户端:Socket 程序感受到的 使用流 :输出流
- 服务器端: ServerSocket —>Socket 程序感受到的 使用流 :输入流
- (客户端和服务器端地位不平等。)
UDP
- UDP:
- 发送方:DatagramSocket 发送:数据包 DatagramPacket
- 接收方:DatagramSocket 接收:数据包 DatagramPacket
- (发送方和接收方的地址是平等的。)
功能分解1—单向通信
实现
package com.ruan.test04;
import java.io.IOException;
import java.net.*;
public class Send {
public static void main(String[] args) throws IOException {
System.out.println("发送方上线");
DatagramSocket datagramSocket = new DatagramSocket(8888);
String str = "Hello";
byte[] bytes = str.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"),9999);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
}
package com.ruan.test04;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
public class Receive {
public static void main(String[] args) throws IOException {
System.out.println("接收方上线");
DatagramSocket datagramSocket = new DatagramSocket(9999);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String s = new String(data, 0, datagramPacket.getLength());
System.out.println("接收到数据"+s);
}
}
功能分解2—双向通信
实现
package com.ruan.test04;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send {
public static void main(String[] args) throws IOException {
System.out.println("====发送方上线=====");
DatagramSocket datagramSocket = new DatagramSocket(8888);
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
byte[] bytes = str.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9999);
datagramSocket.send(datagramPacket);
byte[] bytes1 = new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes.length);
datagramSocket.receive(datagramPacket1);
byte[] data = datagramPacket1.getData();
String s = new String(data, 0, datagramPacket1.getLength());
System.out.println("服务机:" + s);
datagramSocket.close();
}
}
package com.ruan.test04;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;
public class Receive {
public static void main(String[] args) throws IOException {
System.out.println("====接收方上线====");
DatagramSocket datagramSocket = new DatagramSocket(9999);
Scanner scanner = new Scanner(System.in);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String s = new String(data, 0, datagramPacket.getLength());
System.out.println("发送机:" + s);
String str = scanner.nextLine();
byte[] bytes1 = str.getBytes();
DatagramPacket localhost = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("localhost"), 8888);
datagramSocket.send(localhost);
datagramSocket.close();
}
}
分解功能3—加入完整的异常处理
实现
package com.ruan.test04;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send {
public static void main(String[] args){
System.out.println("====发送方上线=====");
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(8888);
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
byte[] bytes = str.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9999);
datagramSocket.send(datagramPacket);
byte[] bytes1 = new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes.length);
datagramSocket.receive(datagramPacket1);
byte[] data = datagramPacket1.getData();
String s = new String(data, 0, datagramPacket1.getLength());
System.out.println("服务机:" + s);
} catch (IOException e) {
e.printStackTrace();
}finally {
datagramSocket.close();
}
}
}
package com.ruan.test04;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;
public class Receive {
public static void main(String[] args) {
System.out.println("====接收方上线====");
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(9999);
Scanner scanner = new Scanner(System.in);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String s = new String(data, 0, datagramPacket.getLength());
System.out.println("发送机:" + s);
String str = scanner.nextLine();
byte[] bytes1 = str.getBytes();
DatagramPacket localhost = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("localhost"), 8888);
datagramSocket.send(localhost);
} catch (IOException e) {
e.printStackTrace();
}finally {
datagramSocket.close();
}
}
}
分解功能4—正常通信
实现
package com.ruan.test04;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class Send {
public static void main(String[] args){
System.out.println("====发送方上线=====");
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(8888);
Scanner scanner = new Scanner(System.in);
while (true){
System.out.print("发送机:");
String str = scanner.nextLine();
byte[] bytes = str.getBytes();
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("localhost"), 9999);
datagramSocket.send(datagramPacket);
if (str.equals("beybey")){
System.out.println("服务下线");
break;
}
byte[] bytes1 = new byte[1024];
DatagramPacket datagramPacket1 = new DatagramPacket(bytes1, bytes.length);
datagramSocket.receive(datagramPacket1);
byte[] data = datagramPacket1.getData();
String s = new String(data, 0, datagramPacket1.getLength());
System.out.println("服务机:" + s);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
datagramSocket.close();
}
}
}
package com.ruan.test04;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.security.spec.RSAOtherPrimeInfo;
import java.util.Scanner;
public class Receive {
public static void main(String[] args) {
System.out.println("====接收方上线====");
DatagramSocket datagramSocket = null;
try {
datagramSocket = new DatagramSocket(9999);
Scanner scanner = new Scanner(System.in);
while (true){
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
String s = new String(data, 0, datagramPacket.getLength());
System.out.println("发送机:" + s);
if (s.equals("byebye")){
System.out.println("服务下线");
break;
}
System.out.print("接收机:");
String str = scanner.nextLine();
byte[] bytes1 = str.getBytes();
DatagramPacket localhost = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("localhost"), 8888);
datagramSocket.send(localhost);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
datagramSocket.close();
}
}
}