Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java程序分享区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
reply to topicflat modethreaded modego to previous topicgo to next topicgo to back
作者 高手帮忙看看这个程序!!
csdnet





发贴: 5
于 2005-12-31 14:27 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我想用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)不能在组播的机子上实现画布清除的同步,就是说我这里清除了,对方的机子上还是存在,并不能同步清除.这是最让我关痛的.

请高手指点.谢谢!


why edited on 2006-01-03 22:55

作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
csdnet





发贴: 5
于 2006-01-03 15:47 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
什么都没有人回啊!这里的人气不是还行吗?


作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
tzutolin



版主


发贴: 581
于 2006-01-03 16:49 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
幫你把程式碼整理一下, 這樣看的比較清楚


作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
csdnet





发贴: 5
于 2006-01-03 22:45 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
谢谢版主.很想有人能给我一个建议.或是给我指点一下.


作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
leowu2000



版主


发贴: 258
于 2006-01-04 10:18 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
先写一下你自己的体会以及想法,别人才有可能加入到讨论中来.
"Java程序分享区",顾名思义,重在分享.重在分享你在开发过程中的所思所想.

或许你有想法,有实现,有体会,但是只有写出来,表达出来,大家才可能进一步的讨论,分享.



Eclipse邮件列表
作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
csdnet





发贴: 5
于 2006-01-04 23:45 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
电子白板的教学功能如上所述.它除了有聊天室的功能外还应该有绘制画图的功能.即当一个人在自己的画板上画图的时候,其他组播组中的人的白板上也可以显示出图形.(这是当初设计的初衷),但是在编程的时候没有考虑过同步清除的功能,因为图形有网络中传输是通过将图形的坐标发送到各个组播组成员,再由组播组成员在各自的机子上调用java.awt中的canvas组件,根据图形坐标来绘制出图形.
现在的问题是如何在保留上述程序的基础上,添加这种功能或是什么改进?
为了增加其功能更好的实现其教学的真正价值.想改进这个程序.
1.添加其画图的功能,比如画正方形或圆形.这样可以增强网上交流的形象性和直观性.
2.加入更换画笔的颜色,不同的地方应该有不同的标记,故所要的画笔也应该不一样.(这在当初设计时未考虑到这一点)

针对以上的两项功能,希望和大家交流一下.



作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
leowu2000



版主


发贴: 258
于 2006-01-05 09:42 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
先声明,我没有运行你的代码,说说我的想法.
1.关于添加其他的画图功能
因为你原有程序只是传输坐标信息,所以接收时候就只能根据坐标信息绘制点,我想要添加其他画图功能,要变动一下传输的数据,对任何绘制的图形进行数据封包,然后传输到客户端,客户端进行解包,解析数据,判断进行什么绘制,然后在客户断进行绘制.所要做的是改造你程序的数据传输和数据封包解包.
2.改变画笔的颜色,这个应该有相应的api设置,属于程序绘画功能扩充的范畴,可以使用不同的按钮(或者下拉选项),或者颜色对话框接收设定的颜色,然后绘制图形时候改变画笔的颜色即可.

此外,如果比较实用,可能还要考虑数据封包的历史记录问题,可以考虑把所有数据封包保留起来,当服务端进行擦除或者删除等操作,只需要发送相应的数据封包标示以及操作命令到客户端,客户端依据命令进行操作,然后更新画面.

当然,更进一步的优化就是考虑如何降低数据传输量,以及响应上,等等.

对了,先搜索一下网上的开源项目,说不定会有类似的可以参考.祝好运!



Eclipse邮件列表
作者 Re:高手帮忙看看这个程序!! [Re:csdnet]
csdnet





发贴: 5
于 2006-01-05 23:23 user profilesend a private message to userreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
谢谢指点,收益不少。



reply to topicflat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923