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

📄 chat.java

📁 主要是对于JAVA的编程的基本语言 希望能够帮得上你。
💻 JAVA
字号:
package UDPchat;

/**
 * Title: Chat类<br>
 * Description: 基于UDP的聊天程序,用于泸州职业技术学院电信系Java课程教学示范。
 * Copyright:(c)2007 www.luzhou.net<br>
 * Company: 泸州职业技术学院电信系
 * @author 华卫
 * @version 1.00
 */

import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

/*
 * 第一个问题:我们这个网络程序能够给自己发送数据吗?当然可以,就像一个人非常孤单,
 * 自己可以给自己写信,一个网络程序也是可以给自己发送数据的,只要在上面的IP文本框
 * 中输入自己主机的地址,你就能够收到自己发给自己的数据了。
 * 
 * 第二个问题:如何发送广播数据?只能在同一个网段中发送广播数据,将该网段IP地址的
 * 主机号部分的每个二进制位都设置为1,这个IP地址就是这个网段的广播地址了,如果我们
 * 发送数据的目标地址是这个网段的广播地址,这个网段上的所有主机都可以接收到发送的
 * 数据。假设我的主机所在的网络号是192.168.0,子网掩码是255.255.255.0,所以,
 * 这个网段的广播地址就是192.168.0.255。如果子网掩码是255.255.254.0,那么,
 * 这个网段的广播地址就是192.168.1.255。在下面这个程序中,只要在IP文本框中输入
 * 指向自己网段的广播地址,你也能收到你发送的数据,因为不管发送方是谁,只要是广播
 * 数据,你的主机都能接收。	 * 
 */

public class Chat extends JFrame{	
	
	static final int PORT = 8137;
	
	//声明组件
	JPanel panel1,panel2;
	JTextArea txtContent,txtInput;
	JTextField txtIP;
	JScrollPane panContent,panInput;
	JButton btnClose,btnSend;
	JLabel lblInputIP;
	
	//声明数据报套接字
	DatagramSocket ds;	
	
    //声明屏幕宽度和高度变量
	int screenWidth,screenHeight;
	
	public static void main(String[] args) {
		new Chat();		
	}
	
	public Chat(){
		
		super("我的聊天室");
		
		//变量赋值
		screenWidth=(int)Toolkit.getDefaultToolkit().getScreenSize().getWidth();
		screenHeight=(int)Toolkit.getDefaultToolkit().getScreenSize().getHeight();
		
		//创建组件
		panel1=new JPanel();
		panel2=new JPanel();
		txtContent=new JTextArea(15,60);
		txtInput=new JTextArea(3,60);
		lblInputIP=new JLabel("输入接收方的IP地址:");
		txtIP=new JTextField("",20);
		panContent=new JScrollPane(txtContent,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		panInput=new JScrollPane(txtInput,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		btnClose=new JButton("关闭");
		btnSend=new JButton("发送");
		
		//添加组件
		getContentPane().add(panContent,"Center");
		getContentPane().add(panel1,"South");
		panel1.setLayout(new GridLayout(0,1));
		panel1.add(panInput);
		panel1.add(panel2);	
		panel2.add(lblInputIP);
		panel2.add(txtIP);
		panel2.add(btnSend);
		panel2.add(btnClose);		
		
		//设置组件属性
		txtContent.setEditable(false);		
		txtContent.setFont(new Font("宋体",Font.PLAIN,13));
		txtInput.setFont(new Font("宋体",Font.PLAIN,15));
		txtContent.setLineWrap(true);
		txtInput.setLineWrap(true);
		txtInput.requestFocus();		
		setSize(600,500);
		setLocation((screenWidth-getWidth())/2, (screenHeight-getHeight())/2); //让窗口在屏幕居中		
		setVisible(true);
		
		try {
			ds=new DatagramSocket(PORT); //定义数据报套接字
		} catch (SocketException e1) {			
			e1.printStackTrace();
		}	
		
		//接收程序代码在一个新线程中完成,这样,在接收处于阻塞状态时,不会影响到程序的发送部分。	 
		new Thread(new Runnable(){			
			public void run() {
				byte[] buffer=new byte[1024];
				DatagramPacket dp=new DatagramPacket(buffer,1024); //定义数据包
				while(true){
					try {
						ds.receive(dp); //接收数据包
						if(dp.getLength()>0){
							txtContent.append(dp.getAddress().getHostName()+">"+new String(buffer,0,dp.getLength())+"\n");							
						}
						else{
							JOptionPane.showMessageDialog(null, "不能发送空信息!","聊天室",JOptionPane.WARNING_MESSAGE);
						}
					} catch (IOException e) {						
						e.printStackTrace();
					}
				}
			}			
		}).start();
		
		////////////////////////////////////////////
		//注册监听器,编写事件代码		
		btnSend.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {							
				try {			
					byte[] buffer=txtInput.getText().getBytes();
					DatagramPacket dp=new DatagramPacket(buffer,buffer.length,InetAddress.getByName(txtIP.getText()),PORT);					
					ds.send(dp); //发送数据包        					
					txtInput.setText("");					
					txtInput.requestFocus();
				} catch (IOException ie) {						
					JOptionPane.showMessageDialog(null, "未知主机异常,你输入的IP地址无效!","聊天室",JOptionPane.ERROR_MESSAGE);
					txtIP.requestFocus();
				} 
			}				
		});
			
		btnClose.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {							
				System.exit(0);
			}				
		});
			
		addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){							
				System.exit(0);
			}				
		});		
	}	
}

⌨️ 快捷键说明

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