`
tmdpzc
  • 浏览: 13391 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论
文章列表
LoginCmd: package com.tcl.chat.command; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.SocketChannel; import com.tcl.chat.ChatServer; import com.tcl.chat.Member; import com.tcl.chat.utils.LogUtil; public class Lo ...
有了Command 接口,我们可以定义一些命令: 这些命令也代表了一些基本的需求 1. @pub 向聊天室中发广播消息 2. @quit 退出聊天室   , 如果断线,聊天室可以自动将与客户端的连接断开 3. @listmember  查看聊天室中的所有人 4. @login  username password  以用户名和密码登陆服务器 5. @regist  username password 注册用户 6. @usr  username|socket address 向特定用户发消息 有了以上需求的话,我们就需要定义一些数据结构: 首先定义会员类: package com.tc ...
学习 java nio ,自己建立一个 nio的聊天室程序。 服务器采用单一线程 轮训,accept的所有端口。 首先定义一个接口,处理 SelectionKey 上的事件。 static interface NioHandler { /** * 处理{@link SelectionKey#OP_ACCEPT}事件 * * @param key * @throws IOException */ void handleAccept(SelectionKey key) throws IOException; /** * ...
android中如果出现未捕获异常就会让应用程序crash掉,给用户的提示仅仅是该应用已崩溃,很不友好,自己定义一个UncaughtExceptionHanlder来捕获UI线程上的Exception,使用AlertDialog的方式展示出来,可以方便测试,也可以提升用户体验 package com.tcl.navigator.common; import java.lang.Thread.UncaughtExceptionHandler; import android.app.AlertDialog; import android.content.Context; impo ...
Android 的Log 类只能以TAG的方式却分不同类的信息,这里利用反射的方式,将Log所在的行号和类名抓出来,以后转交测试的时候如果看到log的消息就可以快速定位软件的bug package com.tcl.navigator.utils; import android.util.Log; public class LogUtils { private static final boolean DEBUG = true; private static final String TAG = "LogUtils.java"; public s ...
最近的项目需求,让多个Android应用共用一条链路,采用AIDL Service 觉得耦合度比较高,于是想想能不能用UDP本地转发的方式来将数据传送到那条链路所在的Service中。 于是写了下面两个测试代码。没有定义协议,直接用了对象序列化的方法。 服务器端代码: import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.net.DatagramPacket; import java.net.DatagramSock ...
客户端代码: import java.io.IOException; import java.io.ObjectOutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class TCPClient extends Thread{ @Override public void run() { Scanner reader = new Scanner(System.in); while (true) ...
Serializable  序列化自动运行 Externalizable    在运行序列化,和反序列化的时候,会调用 writeExternal() and readExternal() methods.
StringBuffer (线程安全) StringBuilder (非线程安全) String 字符串常量StringBuffer 字符串变量(线程安全)StringBuilder 字符串变量(非线程安全) 简要的说, String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM ...
1.volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的 3.volatile仅能实现变量的修改可见性,并能保证原子性;而synchronized则可以保证变量的修改可见性和原子性 4.volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。 5.volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编 ...
Global site tag (gtag.js) - Google Analytics