0 0

一个socket服务端长连接的编写需求5

现在正在写一个socket服务端,需求是:
1。客户只有一个,他的需求是当他发送一个报文到我的server端
2。我收到报文处理完后,不断开此连接一直等待,他也不会断开此连接。
3。客户端以后只用这一个连接想我发送消息。
请问这个服务端程序怎么写,我第一次写socket程序,还没入门,希望同学们帮我下。

问题补充:用java实现
2013年10月24日 20:27

2个答案 按时间排序 按投票排序

0 0

nio

服务端:
public class NIOServer {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        int port = 8888;
        // 打开选择器
        Selector selector = Selector.open();
        // 打开服务器套接字通道
        ServerSocketChannel ssc = ServerSocketChannel.open();
        // 检索与此通道关联的服务器套接字
        ServerSocket serverSocket = ssc.socket();
        // 将 ServerSocket 绑定到特定地址(IP 地址和端口号)
        serverSocket.bind(new InetSocketAddress(port));
        System.out.println("server listen on port:" + port);

        // 调整通道的阻塞模式
        ssc.configureBlocking(false);
        // 向给定的选择器注册此通道,返回一个选择键。SelectionKey.OP_ACCEPT--用于套接字接受操作的操作集位
        ssc.register(selector, SelectionKey.OP_ACCEPT);

        while (true) {
            // timeout:为正,则在等待某个通道准备就绪时最多阻塞 timeout 毫秒;如果为零,则无限期地阻塞;必须为非负数
            // int nKeys=selector.select(1000);或selector.select();
            int nKeys = selector.select(1000);
            if (nKeys == 0) {
                continue;
            }
            //System.out.println(nKeys);
            if (nKeys > 0) {

                for (SelectionKey key : selector.selectedKeys()) {
                   
                    /*
                     * 测试此键的通道是否已准备好接受新的套接字连接-- 如果此键的通道不支持套接字接受操作,则此方法始终返回 false
                     */
                    if (key.isAcceptable()) {
                        ServerSocketChannel server = (ServerSocketChannel) key.channel();
                        SocketChannel sc = server.accept();
                        if (sc == null) {
                            continue;
                        }
                        sc.configureBlocking(false);
                        sc.register(selector, SelectionKey.OP_READ);
                    } else if (key.isReadable()) {
                        // 分配一个新的字节缓冲区
                        ByteBuffer buffer = ByteBuffer.allocate(1024);
                        SocketChannel sc = (SocketChannel) key.channel();
                        int readBytes = 0;
                        String message = null;
                        try {
                            int ret;
                            try {
                                while ((ret = sc.read(buffer)) > 0) {
                                    readBytes += ret;
                                }
                            } catch (Exception e) {
                                sc.close();
                                readBytes = 0;
                                // ignore
                            } finally {
                                // 反转此缓冲区。首先对当前位置设置限制,然后将该位置设置为零
                                buffer.flip();
                            }

                            if (readBytes > 0) {
                                message = Charset.forName("UTF-8").decode(buffer).toString();
                                buffer = null;
                            }
                        } finally {
                            if (buffer != null) buffer.clear();
                        }

                        if (readBytes > 0) {
                            System.out.println("message from client:" + message);
                            if ("quit".equalsIgnoreCase(message.trim())) {
                                sc.close();
                                selector.close();
                                System.out.println("Server has been shutdown!");
                                System.exit(0);
                            }
                            String outMessage = "server response:" + message.toUpperCase();
                            sc.write(Charset.forName("UTF-8").encode(outMessage));
                        }else{
                            InetSocketAddress address1 = (InetSocketAddress)sc.socket().getRemoteSocketAddress();
                            System.out.print("IP地址:"+address1.getAddress()+"端口:"+address1.getPort());
                            System.out.println("远程强制断开!");
                        }

                    }
                }
                selector.selectedKeys().clear();
            }

        }
    }
}

客户端:
public class NIOClient {

    /**
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        // 连接端口
        int port = 8888;
        SocketChannel channel = SocketChannel.open();
        channel.configureBlocking(false);

        // 指定连接地址及连接端口
        SocketAddress target = new InetSocketAddress("127.0.0.1", port);
        channel.connect(target);
        Selector selector = Selector.open();
        // 用于套接字连接操作的操作集位
        channel.register(selector, SelectionKey.OP_CONNECT);
        BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
            if (channel.isConnected()) {
                String command = systemIn.readLine();
                channel.write(Charset.forName("UTF-8").encode(command));

                if (command == null || "quit".equalsIgnoreCase(command.trim())) {
                    systemIn.close();
                    channel.close();
                    selector.close();
                    System.out.println("Client quit !");
                    System.exit(0);
                }
            }
            int nKeys = selector.select();
            if (nKeys > 0) {
                for (SelectionKey key : selector.selectedKeys()) {
                    if (key.isConnectable()) {
                        SocketChannel sc = (SocketChannel) key.channel();
                        sc.configureBlocking(false);
                        sc.register(selector, SelectionKey.OP_READ);
                        sc.finishConnect();
                    } else if (key.isReadable()) {
                        ByteBuffer buffer = ByteBuffer.allocate(1024);
                        SocketChannel sc = (SocketChannel) key.channel();
                        int readBytes = 0;
                        try {
                            int ret = 0;
                            try {
                                while ((ret = sc.read(buffer)) > 0) {
                                    readBytes += ret;
                                }
                            } finally {
                                buffer.flip();
                            }
                            if (readBytes > 0) {
                                System.out.println(Charset.forName("UTF-8").decode(buffer)
                                        .toString());
                                buffer = null;
                            }
                        } finally {
                            if (buffer != null) {
                                buffer.clear();
                            }
                        }
                    }
                }
                selector.selectedKeys().clear();
            }
        }
    }

}

2013年10月25日 14:12
0 0

传统的java socket编程,非常简单,网上随便一搜就有。

2013年10月25日 10:30

相关推荐

    基于netty编写的socket服务端

    在基于Netty编写的socket服务端中,首先需要定义一个`ChannelHandler`,这个处理器负责处理接收到的网络事件,如连接建立、数据读取、连接关闭等。`ChannelHandlerContext`则是`ChannelHandler`和`ChannelPipeline`...

    java编写socket服务端和客户端给予cmpp3.0

    Java 编写基于 CMPP3.0 的 ...通过以上步骤,可以实现一个基于 Java Socket 和 CMPP3.0 协议的短信服务端和客户端,满足与移动运营商短信网关的通信需求。实际开发中,还需要结合具体业务场景进行适当的调整和扩展。

    VB6.0 简单 Socket 服务端

    在这个“VB6.0简单Socket服务端”项目中,开发者使用了Winsock控件来实现了一个基本的Socket服务器。下面将详细解释Socket、Winsock控件以及如何在VB6.0中构建Socket服务端。 Socket,也称为套接字,是网络编程中的...

    pb编写的socket连接

    客户端首先会创建一个Socket,然后通过这个Socket向服务器发起连接请求。一旦连接建立,客户端就可以将序列化后的pb消息发送给服务器。服务端同样创建Socket监听特定端口,等待客户端的连接请求。当收到连接请求后,...

    socket服务端和客户端通讯

    在本主题中,我们将深入探讨"socket服务端和客户端通讯"的核心概念、步骤以及关键知识点。 首先,Socket是Internet上的应用程序之间进行通信的一种机制,它提供了一种标准接口,使得应用层可以直接与传输层进行交互...

    QT中使用C++ socket通信 客户端与服务端的代码实例

    本文将深入探讨如何在QT中使用C++编写客户端和服务端的socket通信代码,以及涉及到的关键操作。 首先,我们需要理解Socket的基本概念。Socket是网络通信中的一个抽象接口,它提供了一种在不同进程间进行网络通信的...

    SuperSocket(客户端+服务端实现).zip

    在客户端方面,SuperSocket提供了一个SocketClient类,用于与服务端建立连接并进行数据交换。开发者可以通过继承这个基类,定制自己的客户端行为。在这个压缩包中,你将找到一个预先实现的Winform客户端,它演示了...

    标准c实现的Socket服务端和客户端源码

    在这个"标准C实现的Socket服务端和客户端源码"中,我们可以深入学习和理解如何在C语言环境下编写Socket程序。以下是对相关知识点的详细说明: 1. **Socket基础知识**: Socket是一种在不同或相同计算机之间进行...

    Python 通过 socket 实现服务端和客户端相互间网络通信的例子

    - 客户端也需要创建一个socket对象,然后使用`connect()`函数连接到服务端的指定地址和端口。 - `send()`函数用于向服务端发送数据,`recv()`用于接收服务端回应的数据。 - 客户端通常只有一个连接,但可以多次...

    C# socket 通信 (客户端与服务端)

    服务端也需要一个Socket对象监听特定端口等待客户端连接,并通过Accept方法接收连接请求。接收到数据后,通过Receive方法读取客户端发送的数据: ```csharp byte[] buffer = new byte[1024]; int received = ...

    socket客户端

    在本案例中,我们关注的是一个使用C#语言编写的Socket客户端代码,这通常用于实现客户端-服务器(C/S)架构的即时通讯系统。C#提供了丰富的.NET Framework类库,使得开发这样的客户端变得相对简单。 首先,`System...

    C#编写的Http服务端

    【C#编写的Http服务端】是一个利用C#编程语言实现的HTTP服务器应用程序。C#是微软公司推出的面向对象的编程语言,它以其强大的功能、简洁的语法和丰富的类库在开发领域占据着重要的地位。在.NET框架的支持下,C#可以...

    服务器端口和客户端的编写

    accept会从监听队列中取出一个连接请求,建立一个新的socket,专门用于处理这个连接,并返回新的socket描述符,而原始socket继续监听后续的连接请求。 客户端的连接过程则涉及到connect函数。客户端通过connect函数...

    服务器_socket_delphi源码_服务端源码_

    在标题中提到的"服务器_socket_delphi源码_服务端源码",这通常指的是一个使用Delphi编写的服务器端程序,该程序利用Socket API来监听和处理来自客户端的连接请求。在Delphi中,我们可以创建一个TIdServer或...

    VS2013 C++ MFC,Socket,TCP服务端,多个客户端通信

    TCP服务端, 多个客户端通信",我们探讨的是如何使用Microsoft Visual Studio 2013中的MFC(Microsoft Foundation Classes)库,结合Socket编程技术,来实现一个TCP(Transmission Control Protocol)服务器,该...

    java socket多客户端之间通信

    - **接受连接**:调用`accept()`方法等待客户端连接,并返回一个新的Socket对象,表示客户端连接。 - **数据交换**:通过Socket的`InputStream`和`OutputStream`进行读写操作,实现数据传输。 4. **客户端实现**...

    QT编写的Socket工具,TCP 以及 UDP 可建立服务端 客户端等,完整源码奉献

    因为频繁需要测试网络连接,所以特意用QT编写了这个Socket工具,可使用TCP 以及 UDP 来建立服务端 和客户端等,涵盖大部分网络测试使用需求,使用 Qt 编写,无错误无警告,可直接编译运行。

    c# 编写的服务端和客服端的文件传输

    每个连接可以由一个单独的线程来处理,确保服务响应的及时性。 - **ThreadPool**:C#中的ThreadPool类可以有效地管理线程资源,用于执行异步任务,如处理客户端的文件传输请求。 3. **文件操作**: - **...

    MFC编写的SOCKET侦听系统服务

    本文将深入探讨如何利用MFC和SOCKET句柄来编写一个能进行网络通信的系统服务。 首先,理解MFC中的服务应用框架。在MFC中,我们可以利用CWinAppEx类来构建服务应用程序,通过重写OnRun()方法来处理服务的启动、停止...

    SuperSocket Socket C# 通讯详细介绍

    首先,SuperSocket是一个轻量级的Socket服务端框架,它支持多种通信协议,如自定义协议、HTTP、FTP等。它的设计目标是提供一个易于扩展的平台,让开发者可以专注于业务逻辑,而不必关心底层Socket通信的复杂性。 **...

Global site tag (gtag.js) - Google Analytics