服务器端
import java.net.*; import java.io.*; import java.util.*; /* 在数据报通信中,发送和接收一个数据报,都需提供一个缓冲区,用来安置发送和接收到的数据报 * 服务器端 * 1.创建数据报套接字DatagramSocket * 2.发送缓存的大小byte[] * 3.构造数据报 DatagramPacket,用来接收长度为 length 的数据包,并将该数据报保存到发送/接收 缓冲区 * 4.用receive()方法从此套接字接收数据报 */
public class ServerThread extends Thread //服务器端线程,用于接收信息 { public ServerThread() {} public void run() { String str1; try { //创建数据报套接字并将其绑定到本地主机上的指定端口 DatagramSocket socket= new DatagramSocket(8009); System.out.println("服务器名:"+InetAddress.getLocalHost().getHostName()); int i=0; while(true) { //创建发送缓存的大小 byte[] inbuf=new byte[256]; //构造 DatagramPacket,用来接收长度为 length 的数据包 DatagramPacket packet=new DatagramPacket(inbuf,inbuf.length); //从此套接字接收数据报包 socket.receive(packet); i++; //提取收到数据报中的数据并转成字符串 str1=new String(packet.getData()); //去空格 str1=str1.trim(); int port=packet.getPort(); //显示接收到的信息 if(str1.length()>0) { System.out.println("远程端口:"+port); System.out.println("服务器已接收到信息:"+str1); //将服务器端收到的信息写入文件 FileWriter fileWriter=new FileWriter("receive.txt"); fileWriter.write(str1); System.out.println("写入数据成功 ,请查看!"); fileWriter.close(); }
//将当前时间打包成UDP数据报发送 String date=new Date().toString(); inbuf=date.getBytes();//存入发送缓存 String servername=InetAddress.getLocalHost().getHostName(); System.out.println("请发送信息给服务器《"+servername+"》"); InetAddress address=packet.getAddress(); packet=new DatagramPacket(inbuf,inbuf.length,address,port); socket.send(packet);//发送时间UDP数据报 //统计次数 if(i>3) { System.out.println("已超过10个客户端请求,服务器将要自动关闭!"); socket.close(); } } } catch(IOException e) { e.printStackTrace(); } } }
public class UDPServer { public static void main(String[] args) { UDPServer frm=new UDPServer(); System.out.println(frm.toString()); } String strbuf=" "; ServerThread serverThread; public UDPServer() { serverThread=new ServerThread(); serverThread.start(); }
}
客户端
import java.net.*; import java.io.*;
public class ClientThread extends Thread { public ClientThread() {} public void run() { String str1; try { String servername=InetAddress.getLocalHost().getHostName(); System.out.println("请发送信息给服务器《"+servername+"》"); DatagramSocket socket=new DatagramSocket();//创建数据报套接字 DatagramPacket packet;//声明数据报变量 while(true) { //从键盘读取信息 BufferedReader buf=new BufferedReader(new InputStreamReader(System.in)); System.out.println("请输入信息:"); str1=buf.readLine(); //存放收发数据对的缓存 byte[] outbuf =new byte[str1.length()]; outbuf=str1.getBytes(); //发送从客户端输入的信息 InetAddress address=InetAddress.getByName(servername); packet=new DatagramPacket(outbuf,outbuf.length,address,8009); socket.send(packet); //接收服务器端发来的时间信息 packet=new DatagramPacket(outbuf,outbuf.length); socket.receive(packet); //获取数据报中的数据内容 String date=new String(packet.getData()); System.out.println("当前时间为 :"+date.toString()); socket.close(); } } catch(IOException e) { e.printStackTrace(); } } }
public class UDPClient { public static void main(String[] args) { UDPClient frm=new UDPClient(); System.out.println(frm.toString()); } ClientThread clientThread; public UDPClient() { clientThread=new ClientThread(); clientThread.start(); } }
怎样实现服务器端统计客户端的请求数,当超过一定的请求数后服务器端将自动关闭?