JAVA Socket长连接

发布于 2022-09-04 02:06:43 字数 3551 浏览 6 评论 0

做了一个指纹门锁,需要用TCP长连接进行服务端和门锁间的数据通信。
目前JAVA写socket服务端,门锁连接JAVA服务端。
服务端开了一个线程在监听门锁发来的数据(此处必须实时监听数据)
在监听的同时,若用socket发送数据的话,会出现异常报错。

第一个类负责接收socket连接

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import com.lock.util.StaticResource;
/**
 * 侦听类
 * 不断侦听Socket连接,将连接的Socket记录,并开启线程接受传来的数据
 * @author plzwb
 */
public class ListenSocket implements Runnable{
    ServerSocket serverSocket = null;
    
    @Override
    public void run() {
        try {
            serverSocket = new ServerSocket(2333);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("2333端口被占用");
        }
        
        while (true) {
            try {
                Socket socket = serverSocket.accept();
                StaticResource.socketList.add(socket);
                new Thread(new OpenRecordSocket(socket)).start();
                System.out.println("Socket已连接");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("accept异常");
            }
        }
    }
}

第二个类负责不断侦听数据

import java.io.IOException;
import java.net.Socket;

import com.lock.util.SocketUtil;
import com.lock.util.StaticResource;

public class OpenRecordSocket implements Runnable{
    Socket socket = null;
    SocketUtil socketUtil = null;
    boolean state = true;

    
    public OpenRecordSocket(Socket socket) {
        this.socket = socket;
        socketUtil = new SocketUtil(socket);
    }
    
    @Override
    public void run() {
        while(state){
            try {
                System.out.println("准备接受");
                String text =  socketUtil.receiveData();
                System.out.println(text);
            } catch (IOException e) {
                StaticResource.socketList.remove(socket);
                state = false;
                System.out.println("Socket已经删除");
            }
        }
    }
}

一个Servlet,访问即可调用socket发送消息

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        Socket socket = StaticResource.socketList.get(0);
        SocketUtil socketUtil = new SocketUtil(socket);
        socketUtil.sendData("hello");
    }

Socket发送接收工具

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class SocketUtil {
    Socket socket = null;

    public SocketUtil(Socket socket) {
        super();
        this.socket = socket;
    }
    
    //发送数据
    public void sendData(String data) throws IOException {
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write(data.getBytes());
    }
    
    //接收数据
    public String receiveData() throws IOException {
        InputStream inputStream = socket.getInputStream();
        byte[] buf = new byte[1024];
        int len = inputStream.read(buf);
        String text = new String(buf, 0, len);
        return text;
    }
}

异常信息如下

Exception in thread "Thread-3" 
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.checkBounds(String.java:381)
    at java.lang.String.<init>(String.java:545)
    at com.lock.util.SocketUtil.receiveData(SocketUtil.java:27)

    at com.lock.socket.OpenRecordSocket.run(OpenRecordSocket.java:25)
    at java.lang.Thread.run(Thread.java:745)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深者入戏 2022-09-11 02:06:43

java.lang.StringIndexOutOfBoundsException: String index out of range: -1

at java.lang.String.checkBounds(String.java:381)
at java.lang.String.<init>(String.java:545)
at com.lock.util.SocketUtil.receiveData(SocketUtil.java:27)

链接关闭,输入流结束时,len=-1
new String(buf, 0, -1) 出现异常

孤独难免 2022-09-11 02:06:43

听过netty么?

泅渡 2022-09-11 02:06:43

老铁 你这个问题 解决了吗? 我也遇到你这个相同的问题了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文