java网络编程之UDP
java网络编程之UDP
java网络编程基于UDP数据报,发送循环发送数据,当发送byby时终止连接,服务端等待接收,当收到byby时服务器关闭连接
Sender发送端代码:
package cn.csuft.poorguy.chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.util.Scanner; public class Sender { public static void main(String[] args) { DatagramSocket socket = null; try { socket = new DatagramSocket(); } catch (SocketException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } Scanner cin = new Scanner(System.in); while(cin.hasNext()) { String msg = cin.nextLine(); //UDP套接字 try { byte []data = msg.getBytes(); InetAddress address = InetAddress.getByName("127.0.0.1"); int port = 7000; //创建数据包 DatagramPacket packet = new DatagramPacket( data, data.length, address, port ); //发送 socket.send(packet); if(msg.equals("byby")) { socket.close(); System.out.println("发送结束"); break; } System.out.println("send"); } catch (SocketException e) { e.printStackTrace(); socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); socket.close(); } } } }
Receive接收端代码:
package cn.csuft.poorguy.chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class Receive { public static void main(String[] args) { System.out.println("服务器启动"); DatagramSocket socket = null; try { //创建UDP套接字 socket = new DatagramSocket(7000); } catch (SocketException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while(true) { try { //数据包 byte []buf = new byte[256]; DatagramPacket packet = new DatagramPacket(buf, buf.length); //接收 socket.receive(packet); //打印内容 byte []data = packet.getData(); String msg = new String(data,0,packet.getLength()); if(msg.equals("byby")) { socket.close(); System.out.println("服务器已经关闭"); break; } System.out.println(msg); } catch (SocketException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
测试结果:
发送方发送结果:
接收方接受结果:
使用两个线程,实现实时通信,一个接收一个发送
发送端程序:
package cn.csuft.poorguy.chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Scanner; public class SendTask implements Runnable { DatagramSocket socket = null; public SendTask() { // TODO Auto-generated constructor stub } public SendTask(DatagramSocket socket) { this.socket = socket; } @Override public void run() { String msg; Scanner cin = new Scanner(System.in); DatagramPacket packet = null; do { System.out.println("目标端口:"); int port = Integer.valueOf(new Scanner(System.in).nextInt()); System.out.print("发送:"); msg = cin.nextLine(); byte []data = msg.getBytes(); try { //创建数据包 packet = new DatagramPacket( data, data.length, InetAddress.getByName("127.0.0.1"), 9000 ); //发送 socket.send(packet); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while (!msg.equalsIgnoreCase("bye")); System.out.println("发送结束"); } }
接收端程序:
package cn.csuft.poorguy.chat; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class ReceiverTask implements Runnable { DatagramSocket socket = null; public ReceiverTask() { // TODO Auto-generated constructor stub } public ReceiverTask(DatagramSocket socket) { this.socket = socket; } @Override public void run() { String msg = null; byte []buf = new byte[1024*8]; do { DatagramPacket packet = new DatagramPacket(buf, buf.length); try { socket.receive(packet); byte []data = packet.getData(); msg = new String(data,0,packet.getLength()); System.out.println("收到: "+msg); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } while (!msg.equalsIgnoreCase("bye")); System.out.println("接收端关闭"); } }