⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 j02150301.java

📁 基于udp的网络聊天室,可以在局域网内两主机间发送接受消息
💻 JAVA
字号:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

public class j02150301 extends Frame implements Runnable
{
  DatagramSocket receSocket;
  DatagramPacket recePacket;
  DatagramSocket sendSocket;
  DatagramPacket sendPacket;
  boolean wantReceive = false;
  
  List list1; 
  Label label1,label2,label3,label4,label5,label6,label7;
  TextField textField1,textField2,textField3,textField4,textField5;   
  Button button1,button2,button3;
    	
 	public j02150301()
  {  
    this.setLayout(null);
    this.setBounds(200,200,400,445);
    this.setTitle("UDP 网络聊天室");
    this.addWindowListener(new WindowAdapter()  
    {
      public void windowClosing(WindowEvent e)
      {
        System.exit(0);
      } 
    });       
      
    label1 = new Label("本地端 IP:");
    try
    {
      label1.setText("本地端 IP:" 
        + InetAddress.getLocalHost().getHostAddress());
    }
    catch(UnknownHostException ecp)
    {
      label1.setText("本地端 IP:无法得知");
    }           
    label1.setBounds( 10, 25, 155, 25 ); 
    label1.setBackground(new Color(255,193,255));   
    this.add(label1);
                   
    label2= new Label("收之Port:");
    label2.setBounds( 170, 25, 60, 25 );
    this.add(label2);        
    textField1 = new TextField("3333");    
    textField1.setBounds( 235, 25, 45, 25 );
    this.add(textField1);    
    
    label3= new Label("送之Port:");
    label3.setBounds( 170, 55, 60, 25 );
    this.add(label3);        
    
    textField2 = new TextField("8888");    
    textField2.setBounds( 235, 55, 45, 25 );
    this.add(textField2);   
    
    button1 = new Button("开始收");
    button1.setBounds( 285, 25, 50, 25 );    
    button1.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        wantReceive = true;
        new Thread(getThis()).start();
        button1.setEnabled(false);
        textField1.setEnabled(false);       	
      }
    });        
    this.add(button1);    
    
    button2 = new Button("停止收");
    button2.setBounds( 340, 25, 50, 25 );    
    button2.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        wantReceive = false;
        button1.setEnabled(true);
        textField1.setEnabled(true);				
      }
    });        
    this.add(button2);
    
    label4= new Label("交谈对向:");
    label4.setBounds( 10, 100, 70, 25 );
    label4.setBackground(new Color(255,193,255)); 
    this.add(label4);
               
    label5 = new Label("IP =");
    label5.setBounds( 80, 100, 25, 25 );
    this.add(label5);
    
    textField3 = new TextField("127.0.0.1");        
    textField3.setBounds( 110, 100, 110, 25 );
    this.add(textField3); 
    
    label6 = new Label("对方收之Port =");
    label6.setBounds( 230, 100, 90, 25 );
    this.add(label6);
        
    textField4 = new TextField("3333");        
    textField4.setBounds( 320, 100, 45, 25 );
    this.add(textField4);    
    
    label7 = new Label("发言:");
    label7.setBounds( 10, 135, 40, 25 );
    this.add(label7);
    
    textField5 = new TextField("Hi cyh");        
    textField5.setBounds( 55, 135, 250, 25 );
    textField5.addKeyListener(new KeyAdapter()
    {
      public void keyReleased(KeyEvent e)
      {
        if(e.getKeyCode() == KeyEvent.VK_ENTER)
        {
          sendMesg();
          textField5.setText("");
        }        
      }
    });
    this.add(textField5);
    
    button3 = new Button("送出");
    button3.setBounds( 310, 135, 70, 25 );    
    button3.addMouseListener(new MouseAdapter()
    {
      public void mouseClicked(MouseEvent e)
      {
        sendMesg();
        textField5.setText("");      
      }
    });
    this.add(button3);
    
    list1 = new List(); 
    list1.setBounds( 10, 175, 380, 260 );       
    this.add(list1);
       
    this.setBackground(new Color(220,255,255));   
    this.setVisible(true);   
  } //public j02150301() end

  
  public void paint(Graphics g)
  {
    list1.setSize(this.getWidth()-20,this.getHeight()-190);
  }
  
  j02150301 getThis()
  {
    return this;
  }
    
  public void run()
  {
    byte receBUF[];
    try
    {
      while( wantReceive ) 
      {          //接收讯息		
        receBUF = new byte[150];  		     		
        receSocket = new DatagramSocket(Integer.parseInt(textField1.getText().trim()));
                          //若不指定本地 Port,会自动 bind 一个本地的 Port
        recePacket = new DatagramPacket(receBUF , receBUF.length );
        receSocket.receive( recePacket );        
        String str = new String( recePacket.getData() ).trim();
        if(!str.equals(""))
        {			//收到的若是空字符串,不加入list 显示
          list1.add(str);
          list1.makeVisible(list1.getItemCount()-1); //卷动到可见最后一项        
        }
        receSocket.close();
        Thread.sleep(1000);
      }
    }    
    catch(UnknownHostException E){System.out.println("Excp1");}
    catch(InterruptedException E){System.out.println("Excp2");}
    catch( SocketException E){System.out.println("Excp3");}
    catch(IOException E){System.out.println("Excp4");}
  } //void run() end
  
  void sendMesg() 
  {   	//送出讯息  	     
    try
    {
      if(textField5.getText().trim().equals(""))
      	 return; //未发言则不送出
      
      if(textField2.getText().trim().equals(""))
      	 textField2.setText( String.valueOf(Integer.parseInt(textField1.getText().trim())+1 ) );
          
      sendSocket = new DatagramSocket(Integer.parseInt(textField2.getText().trim()));
      //sendSocket = new DatagramSocket(); //也可,会自动 bind 一个 Port
        /* 本例有指定本地端「送」之 Port,勿同于本地端「收」之 Port,
           否则讯息可能送不出去,因该 Port 已被使用 */ 
      String mesg 
        = "发言人:IP = " + InetAddress.getLocalHost().getHostAddress()
      	 + " 收之Port = " + textField1.getText().trim() 
         + " 送之Port = " + textField2.getText().trim() 
         + "> " + textField5.getText().trim();
      
      sendPacket 
        = new DatagramPacket( 
            mesg.getBytes(), mesg.getBytes().length,
            InetAddress.getByName(textField3.getText().trim()),    
            Integer.parseInt(textField4.getText().trim()) 
                             );
                //指定对方 IP 地址,及对方用来「收」之Port
                
      mesg = "Send To "+ textField3.getText().trim() 
           + " Port = " + textField4.getText().trim()
           + "> " + textField5.getText().trim();          	
      list1.add(mesg);  //在本地显示自己对别人的发言 
                                       
      sendSocket.send(sendPacket); //送出数据封包
      sendSocket.close();//关闭 DatagramSocket
    }
    catch(SocketException E){System.out.println("Excp5");}
    catch(IOException E){System.out.println("Excp6");}
  }//void sendMesg() end
  
  public static void main(String[] args)
  {
    new j02150301();
  }  
}//class j02150301 end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -