返回顶部
首页 > 资讯 > 服务器 >教你怎么用java实现客户端与服务器一问一答
  • 797
分享到

教你怎么用java实现客户端与服务器一问一答

2024-04-02 19:04:59 797人浏览 薄情痞子
摘要

运行效果 开启多个客户端 服务端效果: 客户端效果: 当一个客户端断开连接: 代码 因为代码中有注释,我就直接贴上来了 服务端: package com.dayrain.s

运行效果

开启多个客户端

服务端效果:

客户端效果:

当一个客户端断开连接:

代码

因为代码中有注释,我就直接贴上来了

服务端:


package com.dayrain.server;
 
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.NIO.ByteBuffer;
import java.nio.channels.*;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
 
public class NiOServer {
    
    private static final int PORT = 8081;
    
    private static final int DEFAULT_BUFFER_SIZE = 1024;
    private final Selector selector;
    private final ByteBuffer readBuffer = ByteBuffer.allocate(NioServer.DEFAULT_BUFFER_SIZE);
    private final ByteBuffer writeBuffer = ByteBuffer.allocate(NioServer.DEFAULT_BUFFER_SIZE);
 
    private static int count = 0;
 
    public static void main(String[] args) throws IOException {
        new NioServer().start();
    }
 
    public NioServer() throws IOException {
        //创建一个服务端channel
        ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
 
        //设置为非阻塞
        serverSocketChannel.configureBlocking(false);
 
        //获取服务器socket
        ServerSocket socket = serverSocketChannel.socket();
        //绑定ip和端口
        socket.bind(new InetSocketAddress(NioServer.PORT));
 
        //创建多路复用选择器,并保持打开状态,直到close
        selector = Selector.open();
 
        //将服务器管道注册到selector上,并监听accept事件
        serverSocketChannel.reGISter(selector, SelectionKey.OP_ACCEPT);
        System.out.println("server start on port: " + NioServer.PORT);
        start();
    }
 
    public void start() throws IOException {
 
        //selector是阻塞的,直到至少有一个客户端连接。
        while (selector.select() > 0) {
            //SelectionKey是channel想Selector注册的令牌,可以通过chancel取消(不是立刻取消,会放进一个cancel list里面,下一次select时才会把它彻底删除)
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            while (iterator.hasNext()) {
                SelectionKey selectionKey = iterator.next();
                iterator.remove();
                //当这个key的channel已经准备好接收套接字连接
                if(selectionKey.isAcceptable()) {
                    connectHandle(selectionKey);
                }
 
                //当这个key的channel已经准备好读取数据时
                if(selectionKey.isReadable()) {
                    readHandle(selectionKey);
                }
            }
        }
    }
 
    
    private void connectHandle(SelectionKey selectionKey) throws IOException {
        //注意,服务端用的是ServerSocketChannel,BIO中是ServerSocket
        ServerSocketChannel serverSocketChannel = (ServerSocketChannel) selectionKey.channel();
        SocketChannel socketChannel = serverSocketChannel.accept();
        if(socketChannel == null) {
            return;
        }
        socketChannel.configureBlocking(false);
        socketChannel.register(selector, SelectionKey.OP_READ|SelectionKey.OP_WRITE);
 
        System.out.println("客户端连接成功,当前总数:" + (++count));
 
        writeBuffer.clear();
        writeBuffer.put("连接成功".getBytes(StandardCharsets.UTF_8));
        writeBuffer.flip();
        socketChannel.write(writeBuffer);
    }
 
    
    private void readHandle(SelectionKey selectionKey){
        SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
        try {
            readBuffer.clear();
            int read = socketChannel.read(readBuffer);
            if(read > 0) {
                readBuffer.flip();
                String receiveData = StandardCharsets.UTF_8.decode(readBuffer).toString();
 
                System.out.println("收到客户端消息: " + receiveData);
 
                writeBuffer.clear();
                writeBuffer.put(receiveData.getBytes(StandardCharsets.UTF_8));
                writeBuffer.flip();
                socketChannel.write(writeBuffer);
            }
 
        }catch (Exception e) {
            try {
                socketChannel.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
            System.out.println("客户端断开了连接~~");
            count--;
        }
    }
}

客户端


package com.dayrain.client;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.SocketChannel;
import java.nio.charset.StandardCharsets;
import java.util.Iterator;
 
public class Nioclient {
 
    private static final int PORT = 8081;
    private static final int DEFAULT_BUFFER_SIZE = 1024;
    private final Selector selector;
    private final ByteBuffer readBuffer = ByteBuffer.allocate(NioClient.DEFAULT_BUFFER_SIZE);
    private final ByteBuffer writeBuffer = ByteBuffer.allocate(NioClient.DEFAULT_BUFFER_SIZE);
 
    public static void main(String[] args) throws IOException {
        NioClient nioClient = new NioClient();
 
        //终端监听用户输入
        new Thread(nioClient::terminal).start();
 
        //这个方法是阻塞的,要放在最后
        nioClient.start();
    }
 
    public NioClient() throws IOException {
        selector = Selector.open();
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress(InetAddress.getLocalHost(), NioClient.PORT));
        socketChannel.configureBlocking(false);
        socketChannel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
    }
 
    public void start() throws IOException {
        while (selector.select() > 0) {
            Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
            while (iterator.hasNext()) {
                SelectionKey selectionKey = iterator.next();
                //拿到selectionKey后要删除,否则会重复处理
                iterator.remove();
                if(selectionKey.isReadable()) {
                    handleRead(selectionKey);
                }
 
                //只要连接成功,selectionKey.isWritable()一直为true
                if(selectionKey.isWritable()) {
                    handleWrite(selectionKey);
                }
            }
        }
    }
 
    
    private void handleWrite(SelectionKey selectionKey) throws IOException {
        SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
 
        // writeBuffer有数据就直接写入,因为另开了线程监听用户读取,所以要上
        synchronized (writeBuffer) {
            writeBuffer.flip();
            while (writeBuffer.hasRemaining()) {
                socketChannel.write(writeBuffer);
            }
            writeBuffer.compact();
        }
 
    }
 
    
    private void handleRead(SelectionKey selectionKey) throws IOException {
        SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
        readBuffer.clear();
        socketChannel.read(readBuffer);
 
        readBuffer.flip();
        String res = StandardCharsets.UTF_8.decode(readBuffer).toString();
        System.out.println("收到服务器发来的消息: " + res);
        readBuffer.clear();
    }
 
    
    private void terminal() {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        try {
            String msg;
            while ((msg = bufferedReader.readLine()) != null) {
                synchronized (writeBuffer) {
                    writeBuffer.put((msg + "\r\n").getBytes(StandardCharsets.UTF_8));
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
 
    }
 
}

到此这篇关于教你怎么用java实现客户端与服务器一问一答的文章就介绍到这了,更多相关java实现客户端与服务器一问一答内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 教你怎么用java实现客户端与服务器一问一答

本文链接: https://lsjlt.com/news/125010.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 教你怎么用java实现客户端与服务器一问一答
    运行效果 开启多个客户端 服务端效果: 客户端效果: 当一个客户端断开连接: 代码 因为代码中有注释,我就直接贴上来了 服务端: package com.dayrain.s...
    99+
    2024-04-02
  • 如何使用java实现客户端与服务器
    小编给大家分享一下如何使用java实现客户端与服务器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Java可以用来干什么Java主要应用于:1. web开发;2....
    99+
    2023-06-14
  • 怎么在java中使用SocketChannel实现一个客户端
    怎么在java中使用SocketChannel实现一个客户端?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。常用的java框架有哪些1.SpringMVC,Spr...
    99+
    2023-06-14
  • Nodejs中怎么实现一个TCP服务端与客户端聊天程序
    今天就跟大家聊聊有关Nodejs中怎么实现一个TCP服务端与客户端聊天程序,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务器端count:连接的客...
    99+
    2024-04-02
  • Java中怎么实现一个Socket通讯客户端
    Java中怎么实现一个Socket通讯客户端,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java Socket通讯代码 <xml version="...
    99+
    2023-06-17
  • Java聊天室之实现一个服务器与多个客户端通信
    目录一、题目描述二、解题思路三、代码详解一、题目描述 题目实现:一个服务器与多个客户端通信。通过一个服务器与多个客户端进行通信,运行程序,服务器启动后,启动两个客户端程序,然后通过服...
    99+
    2022-11-13
    Java实现聊天室 Java 聊天室 Java 服务器与客户端通信
  • python客户端与服务器端通信怎么实现
    Python客户端与服务器端通信可以通过套接字(socket)实现。1. 服务器端首先需要创建一个套接字,并绑定到指定的IP地址和端...
    99+
    2023-09-08
    python 服务器
  • Java中怎么利用Socket实现一个通讯客户端
    本篇文章给大家分享的是有关Java中怎么利用Socket实现一个通讯客户端,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体客户端代码如下:import java.n...
    99+
    2023-06-17
  • Python中怎么实现服务端与客户端连接
    本篇内容主要讲解“Python中怎么实现服务端与客户端连接”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中怎么实现服务端与客户端连接”吧!服务端我们使用 socket 模块的&nbs...
    99+
    2023-06-08
  • C#中怎么实现服务端与客户端通信
    C#中怎么实现服务端与客户端通信,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#服务端与客户端通信实现实例:TcpClient client;&nb...
    99+
    2023-06-17
  • C#中怎么实现服务端与客户端连接
    这篇文章将为大家详细讲解有关C#中怎么实现服务端与客户端连接,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C#服务端与客户端连接实现实例:class Client {&n...
    99+
    2023-06-17
  • java Nio使用NioSocket客户端与服务端交互实现方式
    NioSocket 客户端与服务端交互实现 java Nio是jdk1.4新增的io方式—–nio(new IO),这种方式在目前来说算不算new,更合适的解释应该是non-bloc...
    99+
    2024-04-02
  • 阿里云服务器在哪找客户端?一个详细的解答
    阿里云服务器是一种提供给企业用户的基础计算资源,用户可以基于阿里云服务器进行应用开发、数据存储、网站搭建等。但是,很多用户在初次接触阿里云服务器时,不知道如何找到客户端。本文将详细介绍如何找到阿里云服务器的客户端,并给出一些客户端的使用建议...
    99+
    2023-11-12
    阿里 客户端 服务器
  • Nodejs实现的一个简单udp广播服务器、客户端
    nodejs发送udp广播还是蛮简单的,我们先写个服务器用于接收广播数据,代码如下: var dgram = require("dgram"); var server = dgram.createSock...
    99+
    2022-06-04
    客户端 简单 服务器
  • Java编程Socket如何实现多个客户端连接同一个服务端
    这篇文章主要介绍Java编程Socket如何实现多个客户端连接同一个服务端,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java Socket(套接字)通常也称作"套接字",用于描述IP地址和端口...
    99+
    2023-05-30
    java socket
  • Unity使用webSocket与服务器通信(一)搭建一个简单地服务器和客户端
    你想在unity WebGL里面使用TCP通信吗,那么你可以用一用webSocket。当然,桌面端也可以使用webSocket,这样Unity多平台发布的时候,业务层的通信代码可以使用一套,而不是桌面用socket,网页用http… 一、什...
    99+
    2023-08-19
    unity websocket C# 服务器
  • 怎么实现security.js RSA加密与java客户端解密
    本篇文章给大家分享的是有关怎么实现security.js RSA加密与java客户端解密,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。  在通常的http协议的网站中直接提交数...
    99+
    2023-06-02
  • node中怎么利用Request实现一个HTTP请求客户端
    这期内容当中小编将会给大家带来有关node中怎么利用Request实现一个HTTP请求客户端,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1. 安装及简单使用安装requ...
    99+
    2024-04-02
  • 怎么在C#中使用MJPEG实现一个客户端功能
    怎么在C#中使用MJPEG实现一个客户端功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。环境:服务端MJPEG服务器使用的是手机的DroidCam,很方便的一个MJPEG服务...
    99+
    2023-06-06
  • java中TCP实现回显服务器及客户端
    目录前言:Socket APISeverSocket APITCP实现回显服务器TCP实现回显客户端前言: 上篇文章介绍了TCP的特点。由于TCP的特点是有连接,面向字节流,可靠传输...
    99+
    2023-02-05
    java TCP回显服务器 java TCP 回显客户端
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作