【Java开源代码栏目提醒】:文章导读:在新的一年中,各位网友都进入紧张的学习或是工作阶段。网学会员整理了Java开源代码-UDPHostOne.java的相关内容供大家参考,祝大家在新的一年里工作和学习顺利!
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.InetAddress;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class UDPHostOne extends JFrame implements Runnable, ActionListener {
private static final long serialVersionUID = -2599529900462032037L;
JTextField sentMsg = new JTextField(20);
JTextArea receivedMsg = new JTextArea();
JButton send = new JButton("发送");
/**
* 构造方法,建立通信主界面
*/
UDPHostOne() {
setTitle("主机1"); // 设置窗口标题
setSize(400, 300); // 设置窗口大小
setVisible(true); // 显示主窗口
Container container = this.getContentPane(); // 获得JFrame的内容面板
container.setLayout(new BorderLayout()); // 设置布局方式为BorderLayout
JScrollPane centerPanel = new JScrollPane(); // 创建用于存放聊天记录的滚动面板
receivedMsg = new JTextArea();// 创建存放聊天内容的多行文本输入区对象
centerPanel.setViewportView(receivedMsg); // 将文本区放入滚动面板
// 将滚动面板放到主窗口内容面板中央
container.add(centerPanel, BorderLayout.CENTER);
receivedMsg.setEditable(false);// 将文本区置为不可编辑状态
// 创建底部面板对象,存放聊天标签、聊天栏、发送按钮
JPanel bottomPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
sentMsg = new JTextField(20);// 创建文本输入行对象,存放每次的聊天内容
send = new JButton("发送");// 创建按钮对象
bottomPanel.add(new JLabel("信息")); // 将标签添加到底部面板
bottomPanel.add(sentMsg);// 把聊天内容栏添加到底部面板上
bottomPanel.add(send);// 把发送按钮添加到底部面板上
container.add(bottomPanel, BorderLayout.SOUTH);// 将底部面板放在主窗口的底部
send.addActionListener(this);// 注册发送按钮的动作事件
sentMsg.addActionListener(this);// 注册聊天栏的动作事件
Thread thread = new Thread(this);
thread.start();// 线程负责接收数据包
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/**
* 点击按扭发送数据包, 或者在文本输入框里打回车发送文本
*/
public void actionPerformed(ActionEvent event) {
// 获取图形界面上文本框中输入的信息,将文字前后的空格过滤掉
byte buffer[] = sentMsg.getText().trim().getBytes();
try {
// 设置信息发送的目的地址为127.0.0.1
InetAddress destAddress = InetAddress.getByName("127.0.0.1");
// 将数据封装到数据报,指定发送目的地的端口号
DatagramPacket dataPacket = new DatagramPacket(buffer,
buffer.length, destAddress, 2012);
// 创建数据报套接字
DatagramSocket sendSocket = new DatagramSocket();
receivedMsg.append("=============本地消息============\n");
receivedMsg.append("数据报目标主机地址:" + dataPacket.getAddress() + "\n");
receivedMsg.append("数据报目标端口是:" + dataPacket.getPort() + "\n");
receivedMsg.append("数据报长度:" + dataPacket.getLength() + "\n");
// 向异地发送数据报
sendSocket.send(dataPacket);
sentMsg.setText("");
} catch (Exception e) {
}
}
/**
* 使用线程机制,接收来自异地的数据报
*/
public void run() {
DatagramSocket receiveSocket = null; // 定义数据报套接字
DatagramPacket receivePacket = null; // 定义数据报对象
byte buff[] = new byte[8192]; // 设置数据包最大字节数
try {
// 创建数据报对象,指定数据存储空间和数据长度
receivePacket = new DatagramPacket(buff, buff.length);
// 创建数据报套接字对象,接收信息端口号为2016
receiveSocket = new DatagramSocket(2016);
} catch (Exception e) {
}
while (true) {
// 如果套接字为空,则跳出死循环
if (receiveSocket == null)
break;
else {
// 否则,接收来自异地的数据
try {
receiveSocket.receive(receivePacket); // 接收数据
int length = receivePacket.getLength(); // 获取数据长度
InetAddress adress = receivePacket.getAddress(); // 获取异地主机的IP地址
int port = receivePacket.getPort(); // 获取异地主机的端口号
// 将获取的异地发来的数据转为字符串
String message = new String(receivePacket.getData(), 0, length);
receivedMsg.append("=============异地消息============\n");
receivedMsg.append("收到数据长度:" + length + "\n");
receivedMsg.append("收到数据来自:" + adress + "端口:" + port + "\n");
receivedMsg.append("收到数据是:" + message + "\n");
} catch (Exception e) {
}
}
}
}
public static void main(String args[]) {
new UDPHostOne();
}
}
上一篇:
UDPHandler.java
下一篇:
《南方周末》新闻特稿的采写特点及发展趋势