package udp;
import java.awt.BorderLayout; import java.awt.Container; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.DatagramPacket; import java.net.DatagramSocket;
import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextArea;
public class ServerUI extends JFrame{ JTextArea textarea = new JTextArea(); DatagramSocket ds = null; public ServerUI(){ super("服务器"); Container con = getContentPane(); con.setLayout(new BorderLayout()); textarea.setEditable(false); con.add(new JScrollPane(textarea),BorderLayout.CENTER); setSize(400,600); setVisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ ds.close(); System.exit(0); } }); } private void startServer() { // TODO Auto-generated method stub DatagramPacket dp = null; try { ds = new DatagramSocket(3000); //用来发送和接收数据包的套接字,端口为3000
while (true) { byte[] buf = new byte[1024]; dp = new DatagramPacket(buf,1024); //用于接收长度为1024的数据包,并将数据包的数据部分存在buf中 ds.receive(dp); //从此套接字接收数据报包 displayClientUser(dp); //将加进来的客户端用户显示出来 //发送回复数据包 String message = dp.getAddress().toString().substring(1)+"说:"+new String(buf).trim(); DatagramPacket response = new DatagramPacket(message.getBytes(),message.getBytes().length,dp.getAddress(),dp.getPort()); ds.send(response); } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); }finally{ ds.close(); } } private void displayClientUser(DatagramPacket dp) { // TODO Auto-generated method stub textarea.append(dp.getAddress().toString().substring(1)+"加进来了!\n"); }
public static void main(String[] args) { //new ServerUI().startServer(); new ServerUI().startServer(); } }
--------------------------------------------------------------------------------------------------------------------------------------------------------
package udp;
import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField;
public class ClientUI extends JFrame { JTextArea textarea = new JTextArea(); JTextField textfield = new JTextField(22); DatagramSocket ds = null; DatagramPacket dp = null; public ClientUI(){ super("客户端"); Container con = getContentPane(); con.setLayout(new BorderLayout()); textarea.setEditable(false); con.add(new JScrollPane(textarea),BorderLayout.CENTER); con.add(southPanel(),BorderLayout.SOUTH); setSize(600,500); setVisible(true); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ ds.close(); System.exit(0); } }); } private Component southPanel() { // TODO Auto-generated method stub JPanel panel = new JPanel(); panel.setLayout(new BorderLayout()); JPanel panel2 = new JPanel(); panel2.setLayout(new GridLayout(1,2)); JButton button = new JButton("发送"); button.addActionListener(new ActionListener(){
@Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub sendMessage(ds,dp); //发送数据包 } }); panel2.add(textfield); panel2.add(button); panel.add(panel2,BorderLayout.EAST); return panel; }
public static void main(String[] args) { new ClientUI().startClient(); }
private void startClient() { // TODO Auto-generated method stub try { ds = new DatagramSocket(); //用来发送和接收数据包的套接字 } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } receiveMessage(ds, dp); }
private void receiveMessage(DatagramSocket ds, DatagramPacket dp){ // TODO Auto-generated method stub try { while(true){ byte[] buf = new byte[1024]; dp = new DatagramPacket(buf,1024); //用于接收长度为1024的数据包,并将数据包的数据部分存在buf中 ds.receive(dp); // TODO Auto-generated catch block textarea.append(new String(buf).trim()+"\n"); } }catch(Exception e){ e.printStackTrace(); throw new RuntimeException(e); }finally{ ds.close(); }
}
private void sendMessage(DatagramSocket ds, DatagramPacket dp) { // TODO Auto-generated method stub String str=textfield.getText(); if(str!=null && !str.trim().equals("")){ byte[] sendInfo = str.getBytes(); try { //将数据包发送到10.0.157.126主机的3000端口 dp = new DatagramPacket(sendInfo,sendInfo.length, InetAddress.getByName("10.0.157.126"),3000); ds.send(dp); //发送数据包 } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } textfield.setText(""); } }