步骤一:创建客户端和服务端类
首先,创建类Client表示客户端;然后,创建类Server表示服务端,Client类代码如下所示:
-
public class Client {
-
public static void main(String[] args){
-
}
-
}
Server类代码如下所示:
-
public class Server {
-
public static void main(String[] args){
-
}
-
}
步骤二:客户端向服务器发送数据,服务器端接收该数据
要实现客户端向服务器端发送数据“Hello!I m Client”,详细过程如下:
1)创建Socket实例。在Client类中新建start方法,在该方法中,创建用于接收和发送UDP的DatagramSocket类的实例。客户端使用无参数的构造方法构造DatagramSocket类的实例即可。
2)构建发送包。使用如下构造方法来构造数据包DatagramPacket类的对象:
DatagramPacket(byte[] buf,int length,InetAddress clientAddress,int clientPort)
上述构造方法表示从buf数组中,取出length长度的数据创建数据包对象,该数据包的目标地址是clientAddress、端口是clientPort。本案例的目标IP地址是127.0.0.1,即本机、目标端口是8088.
3)发送数据。使用DatagramSocket类提供的send方法,向目标地址和端口发送报文。
Client类代码如下所示:
-
import ;
-
import ;
-
import ;
-
-
public class Client {
-
private void start() {
-
try{
-
DatagramSocket client = new DatagramSocket();
-
String sendStr = "Hello! I m Client";
-
byte[] sendBuf;
-
sendBuf = ();
-
InetAddress addr = ("127.0.0.1");
-
int port = 8088;
-
DatagramPacket sendPacket = new DatagramPacket(sendBuf,,addr,port);
-
(sendPacket);
-
} catch (Exception e) {
-
();
-
}
-
-
}
-
-
public static void main(String[] args) {
-
-
}
-
-
}
要实现服务端接收客户端发送的数据,详细过程如下:
1)创建Socket实例。在Server类中新建start方法,在该方法中,首先创建用于接收和发送UDP的DatagramSocket(int port)来构造DatagramSocket类的实例。该构造方法可以固定监听port端口的报文。
2)构建接收包。使用如下构造方法来构造数据包DatagramPacket类的对象:
DatagramPacket(byte[] buf, int length)
上述构造方法表示将数据包中length长度的数据装进buf数组。
3)接收数据。使用DatagramSocket类的receive方法接收数据报文。
Server类代码如下所示:
-
import ;
-
import ;
-
import ;
-
-
public class Server {
-
-
public void start() {
-
try{
-
DatagramSocket server = new DatagramSocket(8088);
-
byte[] recvBuf = new byte[100];
-
DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
-
(recvPacket);
-
String recvStr = new String((), 0, ());
-
("客户端说:" + recvStr);
-
} catch (Exception e) {
-
();
-
}
-
}
-
-
public static void main(String[] args) {
-
}
-
}
步骤三:服务器向客户端发送数据,客户端接收数据
要实现服务器向客户端发送数据"Hello ! I m Server",详细过程如下:
1)构建发送包。从上一步客户端发送的数据包中获取客户端的地址和端口号,使用如下构造方法来构造数据包DatagramPacket类的对象:
DatagramPacket(byte[] buf, int length, InetAddress clientAddress, int clientPort)
上述构造方法表示从buf数组中,取出length长度的数据创建数据包对象,该数据包对象的目标地址是clientAddress、端口是clientPort。
2)发送数据,使用DatagramSocket类提供的send方法,向目标地址和端口发送报文。
Server类代码如下所示:
-
import ;
-
import ;
-
import ;
-
-
public class Server {
-
-
public void start() {
-
try{
-
DatagramSocket server = new DatagramSocket(8088);
-
byte[] recvBuf = new byte[100];
-
DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
-
(recvPacket);
-
String recvStr = new String((), 0, ());
-
("客户端说:" + recvStr);
-
-
int port = ();
-
InetAddress addr = ();
-
String sendStr = " Hello ! I m Server");
-
byte[] sendBuf;
-
sendBuf = ();
-
DatagramPacket sendPacket = new DatagramPacket(sendBuf,, addr, port);
-
(sendPacket);
-
();
-
} catch (Exception e) {
-
();
-
}
-
}
-
-
public static void main(String[] args) {
-
}
-
}
客户端接收数据的过程和服务器端接收数据的过程类似,在这里不再赘述。
Client类代码如下所示:
-
import ;
-
import ;
-
import ;
-
-
public class Client {
-
private void start() {
-
try{
-
DatagramSocket client = new DatagramSocket();
-
String sendStr = "Hello! I m Client";
-
byte[] sendBuf;
-
sendBuf = ();
-
InetAddress addr = ("127.0.0.1");
-
int port = 8088;
-
DatagramPacket sendPacket = new DatagramPacket(sendBuf,,addr,port);
-
(sendPacket);
-
-
byte[] recvBuf = new Byte[100];
-
DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
-
(recvPacket);
-
String recvStr = new String((), 0, ());
-
("服务端说:" + recvStr);
-
();
-
} catch (Exception e) {
-
();
-
}
-
-
}
-
-
public static void main(String[] args) {
-
-
}
-
-
}
步骤四:添加客户端和服务器端启动的代码
在Client类的main方法中调用该类的start方法、在Server类的main方法中调用该类start方法。
Client类代码如下所示:
-
import ;
-
import ;
-
import ;
-
-
public class Client {
-
private void start() {
-
try{
-
DatagramSocket client = new DatagramSocket();
-
String sendStr = "Hello! I m Client";
-
byte[] sendBuf;
-
sendBuf = ();
-
InetAddress addr = ("127.0.0.1");
-
int port = 8088;
-
DatagramPacket sendPacket = new DatagramPacket(sendBuf,,addr,port);
-
(sendPacket);
-
-
byte[] recvBuf = new Byte[100];
-
DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
-
(recvPacket);
-
String recvStr = new String((), 0, ());
-
("服务端说:" + recvStr);
-
();
-
} catch (Exception e) {
-
();
-
}
-
-
}
-
-
public static void main(String[] args) {
-
Client client = new Client();
-
();
-
-
}
-
-
}
Server类代码如下所示:
-
import ;
-
import ;
-
import ;
-
-
public class Server {
-
-
public void start() {
-
try{
-
DatagramSocket server = new DatagramSocket(8088);
-
byte[] recvBuf = new byte[100];
-
DatagramPacket recvPacket = new DatagramPacket(recvBuf,);
-
(recvPacket);
-
String recvStr = new String((), 0, ());
-
("客户端说:" + recvStr);
-
-
int port = ();
-
InetAddress addr = ();
-
String sendStr = " Hello ! I m Server");
-
byte[] sendBuf;
-
sendBuf = ();
-
DatagramPacket sendPacket = new DatagramPacket(sendBuf,, addr, port);
-
(sendPacket);
-
();
-
} catch (Exception e) {
-
();
-
}
-
}
-
-
public static void main(String[] args) {
-
Server server = new Server();
-
();
-
}
-
}
步骤五:测试
测试客户端和服务器端是否通信成功。首先,启动服务器端;然后再启动客户端。
客户端控制台运行输出如下:
服务器端说:Hello !I m Server
服务器端控制台运行输出如下:
客户端说:Hello I m Client