我想用java开发一个lan的组播软件
这是我其中 的一个模块(电子白板)具体代码如下:
(1)WbUser.java
package whiteboard;
import javax.swing.UIManager;
import java.awt.*;
public class WBUser {
boolean packFrame = false;
//Construct the application
public WBUser() {
WBFrame frame = new WBFrame();
//Validate frames that have preset sizes
//Pack frames that have useful preferred size info, e.g. from their layout
if (packFrame) {
frame.pack();
}
else {
frame.validate();
}
//Center the window
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height - frameSize.height) / 2);
frame.setVisible(true);
boolean flag = true;
while (flag)
{
flag = frame.waitforpackets(); }
}
//Main method
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());/
}
catch(Exception e) {
e.printStackTrace();
}
new WBUser();
}
}
(2) WBFrame.java
package whiteboard;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.TitledBorder;
import javax.swing.text.JTextComponent;
import java.net.*;
public class WBFrame extends JFrame
{
JLabel jLabel1;
JPanel contentPane;
JScrollPane jScrollPane1;
JTextArea jTextArea1;
JTextField jTextField1;
JButton jButton1;
JTextField jTextField2;
JButton jButton2;
JButton jButton3;
TitledBorder titledBorder1;
TitledBorder titledBorder2;
TitledBorder titledBorder3;
int port; //声明组播使用的端口
MulticastSocket socket; //声明建立组播组使用的MulticastSocket类
InetAddress group; //声明建立组播组使用的组播组地址
DatagramPacket packet; //声明发送和接收数据所使用的DatagramPacket类
String username; //声明用户名
Canvas canvas1; //声明画布
boolean isMember; //声明判断是否已经加入组播组的变量
Color color = new Color(255,0,0); //声明画布使用的颜色为红色
int startx; //声明画图的起点横坐标
int starty; //声明画图的起点纵坐标
int endx; //声明画图的终点横坐标
int endy; //声明画图的终点纵坐标
public WBFrame()
{
jScrollPane1 = new JScrollPane();
jTextArea1 = new JTextArea();
jTextField1 = new JTextField();
jButton1 = new JButton();
jTextField2 = new JTextField();
jButton2 = new JButton();
jLabel1 = new JLabel();
canvas1 = new Canvas();
jButton3 = new JButton();
isMember = false;
enableEvents(64L);
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
contentPane = (JPanel)getContentPane(); //设计布局
titledBorder1 = new TitledBorder("");
titledBorder2 = new TitledBorder("");
titledBorder3 = new TitledBorder("");
contentPane.setLayout(null);
setResizable(false);
setSize(new Dimension(620, 372));
setTitle("白板程序");
jScrollPane1.setBounds(new Rectangle(8, 5, 335, 211));
jTextField1.setEnabled(false);
jTextField1.setBounds(new Rectangle(8, 234, 248, 31));
jButton1.setBounds(new Rectangle(267, 233, 75, 31));
jButton1.setEnabled(false);
jButton1.setBorder(titledBorder1);
jButton1.setText("发送");
jButton3.setEnabled(false);
canvas1.setEnabled(false);
jButton1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton1_actionPerformed(e);
}
});
jTextArea1.setEnabled(false);
jTextField2.setBounds(new Rectangle(98, 289, 158, 31));
jButton2.setBounds(new Rectangle(265, 288, 79, 35));
jButton2.setBorder(titledBorder2);
jButton2.setText("加入");
jButton2.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton2_actionPerformed(e);
}
});
jLabel1.setText("用户名:");
jLabel1.setBounds(new Rectangle(9, 289, 81, 28));
contentPane.setBackground(new Color(184, 184, 217));
canvas1.setBackground(Color.white);
canvas1.setBounds(new Rectangle(358, 5, 251, 269));
canvas1.addMouseListener(new java.awt.event.MouseAdapter() {
public void mousePressed(MouseEvent e) {
canvas1_mousePressed(e);
}
public void mouseReleased(MouseEvent e) {
canvas1_mouseReleased(e);
}
});
jButton3.setBounds(new Rectangle(440, 290, 91, 32));
jButton3.setBorder(titledBorder3);
jButton3.setText("清除");
jButton3.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(ActionEvent e) {
jButton3_actionPerformed(e);
}
});
contentPane.add(jScrollPane1, null);
contentPane.add(jTextField1, null);
contentPane.add(jButton1, null);
contentPane.add(jTextField2, null);
contentPane.add(jButton2, null);
contentPane.add(jLabel1, null);
contentPane.add(canvas1, null);
contentPane.add(jButton3, null);
jScrollPane1.getViewport().add(jTextArea1, null);
}
protected void processWindowEvent(WindowEvent e)
{
super.processWindowEvent(e);
if(e.getID() == 201)
System.exit(0);
}
void jButton2_actionPerformed(ActionEvent e) //当用户点击“加入”(或“离开”)按钮时产生的动作
{
if (!isMember) //如果用户不是组播组成员则加入组播组
{
try
{
port = 5000; //设置端口号
group = InetAddress.getByName("239.0.0.0"); //设置组播组地址
socket = new MulticastSocket(port); //初始化MulticastSocket实例
socket.setTimeToLive(1); //设置组播数据报的发送范围为本地网络
socket.setSoTimeout(10000); //设置套接字的接收数据报的最长时间
socket.joinGroup(group); //加入此组播组
username = jTextField2.getText(); //得到用户所使用的用户名
String tmp = String.valueOf(String.valueOf(username)).concat(" has joined the group");
byte[] data = tmp.getBytes();
packet = new DatagramPacket(data, data.length, group, port); //初始化DatagramPacket实例
socket.send(packet); //向组播组发送次用户已加入组播组的消息
jButton1.setEnabled(true); //界面功能的可用或不可用的设置
jTextField1.setEnabled(true);
jTextArea1.setEnabled(true);
jTextArea1.setEditable(false);
jButton3.setEnabled(true);
canvas1.setEnabled(true);
jTextField2.setText("");
jButton2.setText("离开");
isMember = true; //此用户已成为此组播组的成员
}
catch(Exception e1)
{
System.out.println("Error: " + e1); //捕捉异常情况
}
}
else
{
try
{
String tmp = String.valueOf(String.valueOf(username)).concat(" has left the group");
byte[] data = tmp.getBytes();
packet = new DatagramPacket(data, data.length, group, port);
socket.send(packet); //向组播组发出此用户离开的消息
socket.leaveGroup(group); //离开此组播组
jButton1.setEnabled(false); //界面功能的可用或不可用的设置
jTextField1.setEnabled(false);
jTextArea1.setEnabled(false);
jButton3.setEnabled(false);
canvas1.setEnabled(false);
jTextField2.setText("");
jButton2.setText("加入");
isMember = false; //此用户已不是组播组的成员
}
catch(Exception e1)
{
System.out.println("Error: " + e1); //捕捉异常情况
}
}
}
void jButton1_actionPerformed(ActionEvent e) //用户点击“发送”按钮时产生的动作
{
try
{
String tmp = String.valueOf(String.valueOf(
(new StringBuffer(String.valueOf(String.valueOf(username))))
.append(" said: ").append(jTextField1.getText())));
byte[] data = tmp.getBytes();
packet = new DatagramPacket(data, data.length, group, port);
socket.send(packet);
jTextField1.setText("");
}
catch(Exception e1)
{
System.out.println("Error: " + e1);
}
}
void canvas1_mousePressed(MouseEvent e)
{
startx = e.getX();
starty = e.getY();
}
void canvas1_mouseReleased(MouseEvent e)
{
endx = e.getX();
endy = e.getY();
Graphics g = canvas1.getGraphics();
g.setColor(color);
g.drawLine(startx,starty,endx,endy);
//以下是向组播组传送此用户的画图信息,信息包括用户所画线的起点和终点的横坐标和纵坐标,
//信息以“@”符号起头,以表明此信息是画图信息,每个坐标信息使用“@”符号分割
String tmp = "@" + String.valueOf(startx) + "@" + String.valueOf(starty)
+ "@" + String.valueOf(endx) + "@" + String.valueOf(endy) + "@";
try
{
byte[] data = tmp.getBytes();
packet = new DatagramPacket(data, data.length, group, port);
socket.send(packet);
}
catch(Exception e1)
{
System.out.println("Error: " + e1); }
}
void jButton3_actionPerformed(ActionEvent e) {
canvas1.setBackground(Color.black);
canvas1.setBackground(Color.white);
}
public boolean waitforpackets() //等待组播组发送的消息并在本机上显示出来的函数
{
byte[] packetdata = new byte[512]; //初始化接收数据的DatagramPacket使用的数组
try
{
packet.setData(packetdata); //设定接收数据的DatagramPacket实例的数组大小
packet.setLength(512); //设定接收数据的DatagramPacket实例的长度
socket.receive(packet); //从组播组接收数据
}
catch (Exception e1){
return true; //如果没有新消息则返回
}
packetdata = packet.getData();
if (packetdata[0]!='@') //判断是文字信息或是画图信息
{
//如果是文字信息则在文字信息栏中显示
jTextArea1.append(String.valueOf(String.valueOf(new String(packetdata))).concat("\n"));
}
else
{
try //以下程序段实现将画图起点和终点的坐标信息提取出来的功能
{
byte[] data;
int i = 1;
int size = 0;
int startpos = i;
while(packetdata[i]!='@')
{
i++;
size++;
}
i = startpos;
int j = 0;
data = new byte[size];
while(packetdata[i]!='@')
{
data[j] = packetdata[i];
i++;
j++;
}
startx = Integer.parseInt(new String(data));
i++;
startpos = i;
size = 0;
while(packetdata[i]!='@')
{
i++;
size++;
}
i = startpos;
j = 0;
data = new byte[size];
while(packetdata[i]!='@')
{
data[j] = packetdata[i];
i++;
j++;
}
starty = Integer.parseInt(new String(data));
i++;
startpos = i;
size = 0;
while(packetdata[i]!='@')
{
i++;
size++;
}
i = startpos;
j = 0;
data = new byte[size];
while(packetdata[i]!='@')
{
data[j] = packetdata[i];
i++;
j++;
}
while(packetdata[i]!='@')
{
data[j] = packetdata[i];
i++;
j++;
}
endx = Integer.parseInt(new String(data));
i++;
startpos = i;
size = 0;
while(packetdata[i]!='@')
{
i++;
size++;
}
i = startpos;
j = 0;
data = new byte[size];
while(packetdata[i]!='@')
{
data[j] = packetdata[i];
i++;
j++;
}
while(packetdata[i]!='@')
{
data[j] = packetdata[i];
i++;
j++;
}
endy = Integer.parseInt(new String(data));
Graphics g = canvas1.getGraphics();
g.setColor(color);
g.drawLine(startx,starty,endx,endy);
}
catch(Exception e1)
{
System.out.println("Error" + e1); }
}
return true; }
}
现在问题是:(1)我不能实现更换画笔的颜色.比如可以自由的选择颜色.
(2)不能实现画正方形,或是其他图形的功能
(3)不能在组播的机子上实现画布清除的同步,就是说我这里清除了,对方的机子上还是存在,并不能同步清除.这是最让我关痛的.
请高手指点.谢谢!