疯狂java讲义第6版
⑴ 疯狂java讲义:使用MulticastSocket实现多点广播(4)
该类主要实现底层的网络通信功能 在该类中提供了一个broadCast方法 该方法使用MulticastSocket将指定字符串广播到所有客户端 还提供了sendSingle方法 该方法使用DatagramSocket将指定字符串发送到指定SocketAddress 如程序中前两行粗体字代码所示 除此之外 该类里还提供了 个内部线程类 ReadSingle和ReadBroad 这两个线程类采用循环不断读取DatagramSocket和MulticastSocket中的数据 如果读到的信息是广播来的在线信息 则保持该用户在线 如果读到的是用户的聊天信息 则直接将该信息显示出来
在该类中用到了本程序的一个主类 LanChat 该类使用DefaultListModel来维护用户列表 该类里的每个列表项就是一个UserInfo 该类还提供了一个ImageCellRenderer 该类用于将列表项绘制出用户图标和用户名字
程序清单 codes/ / /LanChat/LanChat java
public class LanChat extends JFrame
{
private DefaultListModel listModel = new DefaultListModel()
//定义一个JList对象
private JList friendsList = new JList(listModel)
//定义一个用于格式化日期的格式器
private DateFormat formatter = DateFormat getDateTimeInstance()
public LanChat()
{
super( 局域网聊天 )
//设置该JList使用ImageCellRenderer作为单元格绘制器
friendsList setCellRenderer(new ImageCellRenderer())
listModel addElement(new UserInfo( all 所有人 null ))
friendsList addMouseListener(new ChangeMusicListener())
add(new JScrollPane(friendsList))
setDefaultCloseOperation(JFrame EXIT_ON_CLOSE)
setBounds( )
}
//向用户列表中添加用户
public void addUser(UserInfo user)
{
listModel addElement(user)
}
//从用户列表中删除用户
public void removeUser(int pos)
{
listModel removeElementAt(pos)
}
//根据地址来查询用户
public UserInfo getUserBySocketAddress(SocketAddress address)
{
for (int i = ; i < getUserNum() ; i++)
{
UserInfo user = getUser(i)
if (user getAddress() != null &&
user getAddress() equals(address))
{
return user;
}
}
return null;
}
// 下面两个方法是对ListModel的包装
//获取该聊天窗口的用户数量
public int getUserNum()
{
return listModel size()
}
//获取指定位置的用户
public UserInfo getUser(int pos)
{
return (UserInfo)listModel elementAt(pos)
}
//实现JList上的鼠标双击监听器
class ChangeMusicListener extends MouseAdapter
{
public void mouseClicked(MouseEvent e)
{
//如果鼠标的击键次数大于
if (e getClickCount() >= )
{
//取出鼠标双击时选中的列表项
UserInfo user = (UserInfo)friendsList getSelectedValue()
//如果该列表项对应用户的交谈窗口为null
if (user getChatFrame() == null)
{
//为该用户创建一个交谈窗口 并让该用户引用该窗口
user setChatFrame(new ChatFrame(null user))
}
//如果该用户的窗口没有显示 则让该用户的窗口显示出来
if (!user getChatFrame() isShowing())
{
user getChatFrame() setVisible(true)
}
}
}
}
/**
* 处理网络数据报 该方法将根据聊天信息得到聊天者
* 并将信息显示在聊天对话框中
* @param packet 需要处理的数据报
* @param single 该信息是否为私聊信息
*/
public void processMsg(DatagramPacket packet boolean single)
{
//获取该发送该数据报的SocketAddress
InetSocketAddress srcAddress = (InetSocketAddress)packet getSocket
Address()
//如果是私聊信息 则该Packet获取的是DatagramSocket的地址 将端口减 才是
//对应的MulticastSocket的地址
if (single)
{
srcAddress = new InetSocketAddress(srcAddress getHostName()
srcAddress getPort() )
}
UserInfo srcUser = getUserBySocketAddress(srcAddress)
if (srcUser != null)
{
//确定消息将要显示到哪个用户对应窗口上
UserInfo alertUser = single ? srcUser : getUser( )
//如果该用户对应的窗口为空 显示该窗口
if (alertUser getChatFrame() == null)
{
alertUser setChatFrame(new ChatFrame(null alertUser))
}
//定义添加的提示信息
String tipMsg = single ? 对您说 : 对大家说 ;
//显示提示信息
alertUser getChatFrame() addString(srcUser getName() + tipMsg
+ ……( + formatter format(new Date()) + )
+ new String(packet getData() packet getLength()) + )
if (!alertUser getChatFrame() isShowing())
{
alertUser getChatFrame() setVisible(true)
}
}
}
//主方法 程序的入口
public static void main(String[] args)
{
LanChat lc = new LanChat()
new LoginFrame(lc 请输入用户名 头像后登录 )
}
}
//定义用于改变JList列表项外观的类
class ImageCellRenderer extends JPanel implements ListCellRenderer
{
private ImageIcon icon;
private String name;
//定义绘制单元格时的背景色
private Color background;
//定义绘制单元格时的前景色
private Color foreground;
public Component getListCellRendererComponent(JList list Object value int
index boolean isSelected boolean cellHasFocus)
{
UserInfo userInfo = (UserInfo)value;
icon = new ImageIcon( ico/ + userInfo getIcon() + gif )
name = userInfo getName()
background = isSelected ? list getSelectionBackground() : list getBack
ground()
foreground = isSelected ? list getSelectionForeground() : list
getForeground()
//返回该JPanel对象作为单元格绘制器
return this;
}
//重写paintComponent方法 改变JPanel的外观
public void paintComponent(Graphics g)
{
int imageWidth = icon getImage() getWidth(null)
int imageHeight = icon getImage() getHeight(null)
g setColor(background)
g fillRect( getWidth() getHeight())
g setColor(foreground)
//绘制好友图标
g drawImage(icon getImage() getWidth() / imageWidth / null)
g setFont(new Font( SansSerif Font BOLD ))
//绘制好友用户名
g drawString(name getWidth() / name length() * imageHeight + )
}
//通过该方法来设置该ImageCellRenderer的最佳大小
public Dimension getPreferredSize()
{
return new Dimension( )
}
}
上面类中提供的addUser和removeUser方法用于暴露给通信类ComUtil使用 用于向用户列表中添加 删除用户 除此之外 该类还提供了一个processMsg方法 该方法用于处理网络中读取的数据报 将数据报中的内容取出 并显示在特定的窗口中
上面讲解的只是本程序的关键类 本程序还涉及YeekuProtocol ChatFrame LoginFrame等类 由于篇幅关系 此处不再给出这些类的源代码 读者可以参考codes/ / /LanTalk路径下的源代码
返回目录 疯狂Java讲义
编辑推荐
Java程序性能优化 让你的Java程序更快 更稳定
新手学Java 编程
lishixin/Article/program/Java/hx/201311/27255
⑵ 推荐几本安卓开发的书籍,我学过一点点java,也算有点java基础的
最好的java学习,最全的java学习
《疯狂Java讲义》---本书并不是一本简单的Java入门教材,也不是一门“闭门造车”式的Java读物。本书来自于笔者6年多的Java培训经历,凝结了笔者近6000个小时的授课经验,总结了上千个Java学员学习过程中的典型错误。
《疯狂Android讲义》---本书全面地介绍了Android应用开发的相关知识。
《轻量级Java EE企业应用实战--Struts 2+Spring+Hibernate整合开发》---本书是《轻量级Java EE企业应用实战》的第3版,第3版保持了第2版内容全面、深入的特点,主要完成全部知识的升级。
《 疯狂Java 突破程序员基本功16课》、《疯狂XML讲义》、《疯狂Ajax讲义Prototype/jQuery+DWR+Spring+Hibernate整合开发》、《Struts 2.1权威指南--基于WebWork核心的MVC开发》、《经典Java EE企业应用实战》
《疯狂HTML 5/CSS 3/JavaScript讲义》 --- 本书是一本全面介绍HTML5、CSS 3和JavaScript前端开发技术的图书,本书系统地介绍了HTML 5常用的元素和属性,HTML 5的表单元素和属性,HTML 5的绘图支持,HTML 5的多媒体支持,CSS 3的功能和用法、包括最前沿的变形与动画功能等。配合‘疯狂java’官网上的视频学习。“李刚老师视频”、“肖文吉老师视频”“李韩飞老师视频”
⑶ 关于java的入门类书籍
楼上说的太有才了,这么多书我保证他自己都没有全看过。书三本,先看李刚的疯狂java讲义,再看疯狂java轻量级框架,再看经典框架,或者孙玉琴的java系列都可以。关键是第一本,是java的基础。视频呢,就看马士兵的全套,或者张孝祥的就可以了。楼上说的三本书都是在新华书店上找的。《Java大学简明教程――实例程序设计》这本书如果新手看了,我保证新手如天书般,甚至失去对java的兴趣~~
对了还有,你自己去淘宝买完北大青鸟的accp系列书,并且认真看完,并且所有的例子都自己一个一个敲过,那么也可以算是java入门了~~
⑷ 零基础的人学java,看哪些书。。求推荐几本书籍
《疯狂java讲义》 对于这本书,相信大家不陌生,《疯狂讲义》这本书深入介绍了java编程的相关方面,这本书的内容有Java基本语法结构、面向对象特征、集合框架体系、 泛型、异常处理、GUI编程、JDBC数据库编程、注释、的IO流体系、多线程编程、网络通信编程、反射机制和java开发中需要的jar包、类和接口。