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 LoginCmd extends Command {
private static ByteBuffer ERROR = ByteBuffer
.wrap("Error username and password".getBytes());
private static ByteBuffer SUCCESS = ByteBuffer.wrap("Login success"
.getBytes());
@Override
public void handleCmd(SelectionKey key, ChatServer server, String[] args)
throws IOException {
// TODO Auto-generated method stub
LogUtil.i("Login CMD :");
SocketChannel sc = (SocketChannel) key.channel();
if (args.length == 3) {
String username = args[1];
String password = args[2];
Member mb = server.getMemberStorage().get(username);
if (mb != null) {
boolean flag = mb.login(username, password);
if (flag) {
sc.write(SUCCESS);
SUCCESS.flip();
server.getLoginMemberMap() //add to login map
.put(sc.socket().getRemoteSocketAddress()
.toString(), mb);
return;
}
}
}
sc.write(ERROR);
ERROR.flip();
return;
}
}
QuitCmd
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;
public class QuitCmd extends Command {
private static ByteBuffer BYE = ByteBuffer.wrap("bye".getBytes());
@Override
public void handleCmd(SelectionKey key, ChatServer server,String[] args) throws IOException {
SocketChannel sc = (SocketChannel) key.channel();
sc.write(BYE);
BYE.flip();
System.out.println("Say goodbye");
String address = sc.socket().getRemoteSocketAddress()
.toString();
System.out.println("close: " + address);
server.getChannelMap().remove(address);
server.getLoginMemberMap().remove(address);
sc.close();
key.cancel();//cancel the key
}
}
再贴一下客户端的程序:
package com.tcl.chat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.tcl.chat.impl.ChatRecordStorageImpl;
public class ChatClient implements Runnable{
private Logger log = Logger.getLogger(ChatClient.class.getName());
SocketChannel mChannel;
boolean bRunFlag = true;
private boolean bIsInit = false;
String mHostname;
int mPort;
private ChatRecordStorage mChatStorage = new ChatRecordStorageImpl();
public ChatClient(String host,int port){
mHostname = host;
mPort = port;
}
private static final int TRY_TIMES = 3;
public void init() throws IOException{
mChannel = SocketChannel.open();
mChannel.configureBlocking(false);
mChannel.connect(new InetSocketAddress(mHostname,mPort));
int i = 0;
boolean error = false;
while (!mChannel.finishConnect() ) {
if (i >= TRY_TIMES) {
error = true;
break;
}
i++;
//
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (error) {
throw new IOException("连接错误,稍后再试");
}
bIsInit = true;
}
@Override
public void run() {
try {
init();
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
if (!bIsInit) {
throw new RuntimeException("not init");
}
ByteBuffer buffer = ByteBuffer.allocate(1024);
KeyBordReader kbr = new KeyBordReader();
new Thread(kbr).start();//阻塞方式的读
while (bRunFlag) {
buffer.clear();
StringBuffer sb = new StringBuffer();
int num;
try {
Thread.sleep(500);
while((num = mChannel.read(buffer)) > 0){
sb.append(new String(buffer.array(),0,num));
buffer.clear();
}
if (sb.length() > 0 ) {
log.log(Level.INFO,"Client Recerive:" + sb.toString());
}
if (sb.toString().toLowerCase().trim().equals("bye")) {
mChannel.close();
kbr.close();
bRunFlag = false;
System.exit(0); //退出
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int port = 10003;
new Thread(new ChatClient("localhost", port)).start();
}
class KeyBordReader implements Runnable{
public KeyBordReader(){
}
private boolean bRunFlag = true;
public void close(){
bRunFlag = false;
}
@Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
while (this.bRunFlag) {
//System.out.println(TIP);
try {
String str = reader.readLine().trim();
if (str == null) {
continue;
}
if (!str.startsWith("@")) {
System.out.println("must begin with @");
continue;
}else if (str.equals("@help")) {
System.out.println(TIP);
}else if (str.equals("@exit")) {
System.exit(0);
}
mChannel.write(ByteBuffer.wrap(str.getBytes()));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
private static String TIP = ""
+ "@pub to send public message\n"
+ "@xxx to send private message \n"
+ "@exit to exit client\n"
+ "@quit to quit from server\n"
+ "@listmember to list members";
}
贴起来好费劲,不如直接上传源码。。。。。。
分享到:
相关推荐
**JAVA NIO 聊天室程序** 在Java编程领域,网络编程是一个重要的部分,而NIO(Non-blocking Input/Output)是Java提供的一种高效、非阻塞的I/O模型,它极大地提升了处理大量并发连接的能力。这个"JAVA NIO 聊天室...
使用NIO socket不需要多线程来处理多个连接的请求,效率非常高 可以作为NIO socket入门的例子,Reactor模式,重点理解key.attach, jar文件里包含了源代码 ...5,封装自己的协议可以做成自己需要的服务器端程序,
服务端程序基于javaNIO,客户端程序基于旧IO,读完<<javaNIO>>后,导入eclipse即可运行,支持多人在线聊天,上下线通知.PS:非GUI程序,毕竟javaSwing用的少,不懂的地方大家可以一起讨论,评论必回!
在本项目"基于NIO的Java聊天室2"中,我们深入探讨了如何利用Java的非阻塞I/O(New Input/Output,NIO)框架来实现一个多人在线聊天室。NIO是一种高效的I/O模型,它允许程序在不阻塞主线程的情况下处理输入和输出操作...
在这个基于NIO的聊天室项目中,我们可以通过分析`Server.java`、`Client.java`和`NioUtil.java`这三个文件来理解NIO的核心概念和实现方式。 首先,`Server.java`文件通常包含了服务器端的主逻辑。在NIO中,服务器会...
java多线程程序设计:Java NIO+多线程实现聊天室 Java基于多线程和NIO实现聊天室 涉及到的技术点 线程池ThreadPoolExecutor 阻塞队列BlockingQueue,生产者消费者模式 Selector Channel ByteBuffer ProtoStuff 高...
在这个"java基于NIO选择器Selector的多人聊天室"项目中,开发者利用NIO的核心特性构建了一个允许多个客户端同时进行交互的聊天平台。 首先,我们需要了解NIO的基本组件。在Java NIO中,`Selector`是核心角色,它...
在"JAVA聊天室程序.rar"中,你可能会看到一个基于Swing或JavaFX的图形用户界面(GUI)的实现,这使得用户可以直接在窗口中输入和查看消息。而在"java+Sockt聊天室.rar"中,可能侧重于网络通信的细节,展示了如何通过...
在本实验中,我们将深入探讨Java编程语言在创建一个简单的聊天室应用中的应用。这个"JAVA综合实验2聊天室"项目旨在让学生理解网络编程的基本原理,特别是如何利用Java实现客户端和服务器之间的通信,以及如何设计多...
Java聊天室程序代码是基于Java编程语言实现的一个多人实时交流平台。这个聊天室的核心功能包括用户注册、登录、发送和接收消息。通过分析提供的压缩包文件名称,我们可以推测出其可能采用了一些并发处理和队列操作的...
在本项目"JAVA 开发Java聊天室程序(java)130226"中,我们将深入探讨如何使用Java语言开发一个实时的、多用户交互的聊天室应用。这个项目涉及了多个关键的Java编程概念和技术,包括网络编程、多线程、并发控制以及...
Java聊天室程序是一种基于Socket通信技术的多用户交互平台,它允许多个...通过学习和实践这个Java聊天室程序,开发者可以深入理解网络编程、多线程编程以及GUI开发等关键技能,对于提升Java应用开发能力具有重要意义。
综上所述,"Java即时通讯聊天室"项目涵盖了网络编程、多线程、安全存储、用户交互等多个核心知识点,是学习和实践Java技术的一个良好平台。通过对这些功能的实现,开发者能够深入理解TCP/IP通信、数据加密、并发控制...
在这个“多线程精品资源--Java NIO+多线程实现聊天室”的压缩包中,我们可以推测它包含了一套关于如何使用Java NIO和多线程技术来创建一个实时聊天应用的教程或示例代码。 首先,多线程是Java中并行处理的基础。...
Java NIO(New I/O)是Java提供的一套新的输入/输出API,自Java 1.4版本起作为标准...Java NIO为处理高性能网络和文件I/O提供了一个强大的工具集,对于需要优化I/O性能的应用程序来说,Java NIO是一个不可或缺的选择。
Java聊天室程序是一种基于Java编程语言实现的网络通信应用,它允许用户通过互联网进行实时文本交流。这个压缩包“Java聊天室程序(java).zip”很可能包含了一系列源代码文件、配置文件和其他必要的资源,用于构建一个...
5. **网络编程**:聊天室需要通过网络连接进行通信,因此可能使用了Java的Socket编程或者更高层次的API如Java NIO(非阻塞I/O)或Java.net包中的其他类。客户端和服务器之间通过TCP/IP协议交换数据。 6. **数据结构...
【标题】"聊天室基础项目资料_socket聊天室_聊天室_java项目_socket_" 涉及的是基于Java的Socket编程技术,用于实现一个TCP/IP通信的即时聊天室。在这个项目中,开发者将学习如何利用Java的Socket类来创建客户端和...