java综合实验二聊天室_java网络聊天室实验

这是一个使用Java编写的简单聊天室程序,通过DatagramSocket实现UDP通信。程序包含一个文本框用于输入IP地址,一个列表框展示接收的消息。当用户按下回车键时,程序会发送文本框中的内容到指定IP的3000端口,并清空文本框。同时,程序在后台不断接收并显示来自同一端口的消息。
摘要由CSDN通过智能技术生成

1.[文件]

Chat.java ~ 4KB

下载(113)

package 鸿雁;

import java.awt.*;

import java.awt.event.*;

import java.net.*;

public class Chat extends Frame{

/**

*

*/

private static final long serialVersionUID = 1L;

//Frame f = new Frame("林林的聊天室");

/* tfIP 是用于输入IP 地址的文本框,在发送数据时,要取出其中的IP 地址,所以将其定义成员变

量,以便发送消息的程序代码访问。*/

TextField tfIP = new TextField(15);

/*lst 是用于显示接收消息的列表框,在接收到数据时,要向其中增加新的记录项,所以将其定义成员

变量,以便接收消息的程序代码访问。*/

List lst = new List(6);

DatagramSocket ds;

Image iMainWinBkg = null;

/*由于DatagramSocket 的构造函数声明可能抛出异常,我们的程序需要用try…catch 语句进行异

常捕获处理,所以我们不能直接在这里调用DatagramSocket的构造函数对ds进行初始化,我们需要将ds

的初始化放在Chat类的构造函数中去完成。*/

public Chat() {

try {

ds = new DatagramSocket(3000);

} catch (Exception ex) {

// TODO: handle exception

ex.printStackTrace();

}

/*接收程序代码在一个新的线程中完成,这样,在接收处于阻塞状态时,不会影响到程序的发送部分。*/

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

byte [] buf = new byte[1024];

DatagramPacket dp = new DatagramPacket(buf, 1024);

while (true) {

try {

ds.receive(dp);

lst.add(new String(buf, 0, dp.getLength())

+ " from "

+ dp.getAddress().getHostAddress()

+ ": "

+ dp.getAddress().getHostName().toString()

+ ", 端口号: "

+ dp.getPort(), 0);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}).start();

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

Chat mChat = new Chat();

mChat.init();

}

public void init() {

try {

tfIP.setText(InetAddress.getLocalHost().getHostAddress().toString());

} catch (Exception e3) {

// TODO Auto-generated catch block

e3.printStackTrace();

}

this.setTitle("林林的聊天室");

this.setSize(640, 480);

this.setLocation((java.awt.Toolkit.getDefaultToolkit().getScreenSize().width - this.getWidth()) / 2,

(java.awt.Toolkit.getDefaultToolkit().getScreenSize().height- this.getHeight()) / 2);

String creAccBkPath = "mainWinBkg.jpg"; // relative path of background picture.

iMainWinBkg = this.getToolkit().getImage(creAccBkPath); // background image.

//f.setBackground(new Color(100, 150, 200)); // set background color

this.add(lst);

Panel p = new Panel();

p.setLayout(new BorderLayout());

p.add("West", tfIP);

TextField tfData = new TextField(68);

p.add("East", tfData);

this.add("South", p);

this.setVisible(true);

//this.setLayout(null); // set layout so that buttons on f window is free to change size and location.

this.setResizable(false); // can't change size of the window.

//f.setUndecorated(true);

this.addWindowListener(new MainWindowListener(ds)); // register window listener for closing.

//增加在消息文本框中按下回车键的事件处理代码

tfData.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

//要在这里增加网络消息发送相关程序代码

//取出文本框中的消息字符串,并将其转换成字节数组

byte[] buf;

buf = e.getActionCommand().getBytes();

DatagramPacket dp = null;

try {

dp = new DatagramPacket(buf, buf.length, InetAddress.getByName(tfIP.getText()), 3000);

} catch (UnknownHostException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

try {

ds.send(dp);

} catch (Exception e2) {

// TODO: handle exception

e2.printStackTrace();

}

//下面的语句用于数据发送后,清空文本框中原来的内容

((TextField)e.getSource()).setText("");

}

});

//CreAccYesBtn mCreAccYesBtn = new CreAccYesBtn();

//mCreAccYesBtn.addYesBtn(f);

}

public void paint(Graphics g) {

getGraphics().drawImage(iMainWinBkg, -370, 0, this);

}

}

class MainWindowListener extends WindowAdapter

{

DatagramSocket mds;

public MainWindowListener(DatagramSocket ds) {

mds = ds;

}

public void windowClosing(WindowEvent e)

{

mds.close(); //程序退出时,关闭Socket,释放相关资源

//ystem.out.println(ss);

e.getWindow().setVisible(false);

((Window)e.getComponent()).dispose(); // release all resources used by this window.

System.exit(0);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值