当前位置:首页 » 编程语言 » 疯狂java讲义第6版

疯狂java讲义第6版

发布时间: 2023-09-20 03:13:52

⑴ 疯狂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包、类和接口。

热点内容
android编程入门经典pdf 发布:2025-02-02 04:46:19 浏览:54
安卓什么软件测试手机电池 发布:2025-02-02 04:28:52 浏览:993
手机上传快 发布:2025-02-02 04:27:46 浏览:307
电脑配置详解图解都有哪些 发布:2025-02-02 04:26:27 浏览:715
景区应该有什么配置 发布:2025-02-02 04:09:08 浏览:119
c语言与java工作 发布:2025-02-02 03:59:57 浏览:282
qq买什么不要支付密码 发布:2025-02-02 03:50:29 浏览:495
android读取视频 发布:2025-02-02 03:46:57 浏览:826
手机号序列码的密码在哪里 发布:2025-02-02 03:29:34 浏览:878
安卓怎么换回鸿蒙系统 发布:2025-02-02 03:24:35 浏览:513