用DatagramSocket與DatagramPacket實現UDP通訊.java
UDP比TCP相對來講簡單一點,不須要等待鏈接,且處理數據不須要用輸出輸出流,只須要DatagramPacket.嚴格來講,UDP沒有服務端和客戶端之分,只有發送端與接收端之分.數組
發送端首先創建DatagramSocket與DatagramPacket,設置好DatagramPacket的端口與ip,再經過DatagramSocket發送.app
DatagramSocket socket = new DatagramSocket(55555);
這裏的55555端口是指數據經過這個端口發送.socket
InetAddress ip = InetAddress.getByName("127.0.0.1"); int port = 12345; String message = "message"; DatagramPacket packet = new DatagramPacket(message.getBytes(),message.getBytes().length,ip,port);
構造方法DatagramPacket()的四個參數分別爲測試
這裏端口不能與上面的一致,否則的話會提示端口被佔用..net
socket.send(packet);
接收端只需指定端口進行接收,這裏的端口在DatagramSocket中的構造方法中指定,與發送端的發送的packet中設置的端口一致.code
DatagramSocket socket = new DatagramSocket(12345);
這裏建立的DatagramPacket只須要指定存儲數據的字節數組與該字節數組的長度.server
byte [] message = new byte[2048]; DatagramPacket packet = new DatagramPacket(message, message.length);
socket.receive(packet);
這個方法會阻塞,直到接收到packet.blog
接收到packet後能夠使用getData()獲取數據,返回字節數組,能夠傳遞給String的構造方法建立String.圖片
String str = new String(packet.getData());
這裏人爲地設定了客戶端與服務端,能夠互相發送數據,服務端輸入後發送到服務端,服務端返回固定數據, "客戶端"與"服務端"輪流扮演了發送端與接收端的角色.配合了swing使用.
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.ServerSocket; import java.net.Socket; import javax.swing.*; public class Server { public static void main(String[] args) { JFrame frame = new JFrame("Server"); JTextArea text = new JTextArea(); frame.add(text); frame.setSize(600, 300); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); try { byte [] message = new byte[2048]; DatagramSocket socket = new DatagramSocket(12345); DatagramPacket packet = new DatagramPacket(message, message.length); socket.receive(packet); InetAddress ip = packet.getAddress(); int port = packet.getPort(); text.setText("ip : "+ip.toString()+"\n"); text.append("port : "+port+"\n"); text.append("message : "+new String(packet.getData())); String messageFromServer = "Message from server"; packet = new DatagramPacket(messageFromServer.getBytes(),messageFromServer.getBytes().length,ip,port); socket.send(packet); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.Socket; import javax.swing.*; import java.awt.GridLayout; public class Client { public static void main(String[] args) { JFrame frame = new JFrame(); JTextArea text = new JTextArea(); JButton send = new JButton("send"); GridLayout layout = new GridLayout(2,1,1,1); frame.setLayout(layout); frame.setTitle("Client"); frame.setVisible(true); frame.setLocationRelativeTo(null); frame.setSize(600, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(text); frame.add(send); send.addActionListener( v-> { try { InetAddress ip = InetAddress.getByName("127.0.0.1"); int port = 12345; DatagramSocket socket = new DatagramSocket(55555); String message = text.getText(); DatagramPacket packet = new DatagramPacket(message.getBytes(),message.getBytes().length,ip,port); socket.send(packet); byte [] messageFromServer = new byte[2048]; packet = new DatagramPacket(messageFromServer, messageFromServer.length); socket.receive(packet); text.setText(new String(packet.getData())); socket.close(); } catch (IOException e) { e.printStackTrace(); } }); } }