Java 在通过套接字接收数据时放入超时

Java 在通过套接字接收数据时放入超时,java,Java,我有一个在Java中通过套接字类发送数据的函数。当我发送数据时,我需要接收一些数据。问题是如何在2sec上设置等待数据的超时(若我在2sec中并没有收到数据,我需要理解这一点,比如通信错误和显示消息)。 这是我的密码,有什么帮助吗 public boolean SendMonitorMessage( final MonitorRequestRepeatMessageTCP message) { boolean result = true;

我有一个在Java中通过套接字类发送数据的函数。当我发送数据时,我需要接收一些数据。问题是如何在2sec上设置等待数据的超时(若我在2sec中并没有收到数据,我需要理解这一点,比如通信错误和显示消息)。 这是我的密码,有什么帮助吗

    public boolean SendMonitorMessage(
            final MonitorRequestRepeatMessageTCP message) {
        boolean result = true;
        System.out
                .println("****************** SEND MONITOR REQUEST REPEAT MESSAGE TCP **********************************");

        // new Thread() {
        // public void run() {
        int prevService=message.GetService();
        synchronized (socket) {
            try {
                System.out.println("IPADDRESS=" + ipAddress);
                System.out.println("PORT=" + port);
                System.out.println("Is reachable=" + Ping());
                message.PrintMessage(message.toBytes());

                OutputStream socketOutputStream = (OutputStream) socket
                        .getOutputStream();
                socketOutputStream.write(message.toBytes());

                InputStream socketInputStream = (InputStream) socket
                        .getInputStream();

                byte[] buffer = new byte[256];
                List<byte[]> received = new LinkedList<byte[]>();
                int numberReceived;
                byte[] tempBuffer;

                while ((numberReceived = socketInputStream.read(buffer)) != -1) {
                    tempBuffer = new byte[numberReceived];
                    ByteBuffer baferce = ByteBuffer.wrap(tempBuffer);
                    baferce.put(buffer, 0, numberReceived);
                    received.add(tempBuffer);
                }

                if (received.size()>0){
                    new MonitorResponseMessageTCP(received, message.GetMonitorVariablesArrayList(), prevService);
                }
            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return true;
    }
公共布尔SendMonitorMessage(
最终监视器RequestRepeatMessageTCP消息){
布尔结果=真;
系统输出
.println(“**********************发送监视请求重复消息TCP**********************************************”);
//新线程(){
//公开募捐{
int prevService=message.GetService();
同步(套接字){
试一试{
System.out.println(“IPADDRESS=“+IPADDRESS”);
System.out.println(“端口=”+端口);
System.out.println(“可访问=”+Ping());
message.PrintMessage(message.toBytes());
OutputStream套接字OutputStream=(OutputStream)套接字
.getOutputStream();
write(message.toBytes());
InputStream套接字InputStream=(InputStream)套接字
.getInputStream();
字节[]缓冲区=新字节[256];
接收列表=新建LinkedList();
接收的整数;
字节[]临时缓冲区;
while((numberReceived=socketInputStream.read(buffer))!=-1){
tempBuffer=新字节[numberReceived];
ByteBuffer baferce=ByteBuffer.wrap(临时缓冲区);
baferce.put(缓冲区,0,接收编号);
已接收。添加(临时缓冲区);
}
如果(接收到的.size()>0){
新的MonitorResponseMessageCp(已接收,message.GetMonitorVariablesArrayList(),prevService);
}
}捕获(未知后异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
返回true;
}
请参见和。这两个类都有一个
设置otimeout
方法来指定等待连接或等待接收数据时的最长等待时间。当该时间过去后,套接字抛出一个
SocketTimeoutException
,您可以处理错误消息或按自己的意愿处理

在执行要超时的操作之前,必须调用
setSoTimeout

之前

while ((numberReceived = socketInputStream.read(buffer)) != -1) {
你需要打电话

socket.setSoTimeout(2000);

然后将
catch(SocketTimeoutException)
部分添加到您已有的try/catch块。

您不需要强制转换
(OutputStream)socket.getOutputStream()
,因为它已经是该类型。您应该考虑使用
System.arraycopy
在阵列之间复制数据。