java NIO实现简单聊天程序

网友投稿 326 2022-09-13


java NIO实现简单聊天程序

本文实例为大家分享了java NIO实现简单聊天程序的具体代码,供大家参考,具体内容如下

服务端

功能:

1、接受客户端连接

2、发送消息

3、读取客户端消息

Server.java

public class Server {

private Selector selector;

private ByteBuffer writeBuffer = ByteBuffer.allocate(1024);

private ByteBuffer readBuffer = ByteBuffer.allocate(1024);

Msg msg = new Msg();

MsgSender msgSender = new MsgSender(msg);

public static void main(String[] args) {

Server server = new Server();

new Thread(server.msgSender).start();

server.start();

}

//初始化服务端

public Server() {

try {

this.selector = Selector.open();

ServerSocketChannel ssc = ServerSocketChannel.open();

ssc.configureBlocking(false);

ssc.bind(new InetSocketAddress(8899));

ssc.register(this.selector, SelectionKey.OP_ACCEPT);

System.out.println("服务端初始化完毕。。。。");

} catch (IOException e) {

e.printStackTrace();

}

}

//启动服务端等待selector事件

public void start() {

while (true) {

try {

int num = this.selector.select();

if (num > 0) {

Iterator it = this.selector.selectedKeys().iterator();

while (it.hasNext()) {

SelectionKey key = it.next();

it.remove();

if (key.isValid()) {

if (key.isAcceptable()) {

this.accept(key);

}

if (key.isReadable()) {

this.read(key);

}

if (key.isWritable()) {

this.write(key);

}

}

}

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

//发送消息

private void write(SelectionKey key) {

SocketChannel sc = (SocketChannel) key.channel();

try {

sc.configureBlocking(false);

} catch (IOException e) {

e.printStackTrace();

}

//判断是否有消息需要发送

if(msg!=null && msg.getFlag()){

System.out.println(msg);

try {

msg.setFlag(false);

writeBuffer.clear();

writeBuffer.put(msg.getContent().getBytes());

writeBuffer.WVGxUxcRCGflip();

sc.write(writeBuffer);

} catch (IOException e) {

e.printStackTrace();

}

}

}

//读取客户端消息

private void read(SelectionKey key) {

SocketChannel sc = (SocketChannel) key.channel();

try {

sc.configureBlocking(false);

readBuffer.clear();

int read = sc.read(readBuffer);

if (read == -1) {

sc.close();

key.cancel();

}

readBuffer.flip();

System.out.println(new String(readBuffer.array()));

} catch (IOException e) {

e.printStackTrace();

}

}

//接受客户端连接

private void accept(SelectionKey key) {

ServerSocketChannel ssc = (ServerSocketChannel) key.channel();

try {

SocketChannel sc = ssc.accept();

System.out.println(String.format("a new client join!!!host:%s;port:%d", sc.socket().getLocalAddress(), sc.socket().getPort()));

sc.configureBlocking(false);

sc.register(this.selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);

} catch (IOException e) {

e.printStackTrace();

}

}

}

Msg.java

class Msg {

private Boolean flag=false;

private String content;

public Boolean getFlag() {

return flag;

}

public void setFlag(Boolean flag) {

this.flag = flag;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

WVGxUxcRCG@Override

public String toString() {

return "Msg{" +

"flag=" + flag +

", content='" + content + '\'' +

'}';

}

}

MsgSender.java

class MsgSender implements Runnable{

private Msg msg;

public MsgSender(Msg msg) {

this.msg = msg;

}

@Override

public void run() {

while (true) {

System.out.println("input:\n");

Scanner scanner = new Scanner(System.in);

this.msg.setContent(scanner.next());

this.msg.setFlag(true);

}

}

}

客户端

采用的时BIO,简单的使用线程实现消息的读写

功能:

1、连接服务端

2、读取消息

3、发送消息

public class Client {

private SocketChannel sc;

ByteBuffer writeBuffer = ByteBuffer.allocate(1024);

ByteBuffer readBuffer = ByteBuffer.allocate(1024);

public static void main(String[] args) {

new Client();

}

public Client() {

try {

sc = SocketChannel.open();

//连接服务端

sc.connect(new InetSocketAddress(8899));

//发送消息

this.write(sc);

//读取消息

this.read(sc);

} catch (IOException e) {

e.prinhttp://tStackTrace();

}

}

private void read(SocketChannel sc) {

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

try {

readBuffer.clear();

int read = sc.read(readBuffer);

readBuffer.flip();

System.out.println(new String(readBuffer.array()));

} catch (IOException e) {

e.printStackTrace();

}

}

}

}).start();

}

private void write(SocketChannel sc) {

new Thread(new Runnable() {

@Override

public void run() {

while (true) {

Scanner scanner = new Scanner(System.in);

String next = scanner.next();

writeBuffer.clear();

writeBuffer.put(next.getBytes());

writeBuffer.flip();

try {

sc.write(writeBuffer);

} catch (IOException e) {

e.printStackTrace();

}

}

}

}).start();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:博科300交换机不中断(non-disruptive)固件升级(博科交换机初始化配置)
下一篇:TCP四次挥手
相关文章

 发表评论

暂时没有评论,来抢沙发吧~