这个用来设置与socket的inputStream相关的read操作阻塞的等待时间,超过设置的时间了,假如还是阻塞状态,会抛出异常java.net.SocketTimeoutException: Read timed out

这里的阻塞不是指read的时间长短,可以理解为没有数据可读,线程一直在这等待

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.ByteBuffer; public class Server {
private static final int PORT = ; public static void main(String[] args) throws IOException {
ServerSocket server = new ServerSocket();
// 是否复用未完全关闭的地址端口
server.setReuseAddress(true);
// 等效Socket#setReceiveBufferSize
server.setReceiveBufferSize( * * );
// 设置serverSocket#accept超时时间
// server.setSoTimeout(2000);
// 设置性能参数:短链接,延迟,带宽的相对重要性
server.setPerformancePreferences(, , );
// 绑定到本地端口上
server.bind(new InetSocketAddress(Inet4Address.getLocalHost(), PORT), );
System.out.println("服务器start~");
System.out.println("服务器信息:" + server.getInetAddress() + " P:" + server.getLocalPort()); // 等待客户端连接
for (; ; ) {
// 得到客户端
Socket client = server.accept();
// 客户端构建异步线程
ClientHandler clientHandler = new ClientHandler(client);
// 启动线程
clientHandler.start();
} } /**
* 客户端消息处理
*/
private static class ClientHandler extends Thread {
private Socket socket; ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
System.out.println("新客户端连接:" + socket.getInetAddress() + " P:" + socket.getPort());
try {
// 得到套接字流
OutputStream outputStream = socket.getOutputStream();
InputStream inputStream = socket.getInputStream(); byte[] buffer = new byte[];
int readCount = inputStream.read(buffer);
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, , readCount); // int
int i = byteBuffer.getInt();
// String
int pos = byteBuffer.position(); String str = new String(buffer, pos, readCount - pos); System.out.println("收到数量:" + readCount + " 数据:"
+ i + "\n "
+ str + "\n"); // 这里可以测试socketimeout异常 , 即 在客户端设置 socket.setSoTimeout(5000);
//而服务端一直没有回写数据,在客户端就会抛出 java.net.SocketTimeoutException: Read timed out
// outputStream.write(buffer, 0, readCount);
// outputStream.close();
// inputStream.close(); Thread.sleep();
} catch (Exception e) {
System.out.println("连接异常断开");
} finally {
System.out.println("连接关闭");
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println("客户端已退出:" + socket.getInetAddress() +
" P:" + socket.getPort());
}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Inet4Address;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketException;
import java.nio.ByteBuffer; public class Client {
private static final int PORT = ;
private static final int LOCAL_PORT = ; public static void main(String[] args) throws IOException {
Socket socket = new Socket();
//设置读取超时时间为2秒
socket.setSoTimeout();
// 是否需要在长时无数据响应时发送确认数据(类似心跳包),时间大约为2小时
//socket.setKeepAlive(true);
// 设置接收发送缓冲器大小
socket.setReceiveBufferSize( * * );
socket.setSendBufferSize( * * );
// 绑定到本地20001端口
socket.bind(new InetSocketAddress(Inet4Address.getLocalHost(), LOCAL_PORT));
// 链接到本地20000端口,超时时间3秒,超过则抛出超时异常
socket.connect(new InetSocketAddress(Inet4Address.getLocalHost(), PORT), ); System.out.println("已发起服务器连接,并进入后续流程~");
System.out.println("客户端信息:" + socket.getLocalAddress() + " P:" + socket.getLocalPort());
System.out.println("服务器信息:" + socket.getInetAddress() + " P:" + socket.getPort()); try {
// 发送接收数据
todo(socket);
} catch (Exception e) {
e.printStackTrace();
System.out.println("异常关闭");
}finally {
// 释放资源
socket.close();
System.out.println("客户端已退出~");
}
} private static void todo(Socket client) throws IOException {
// 得到Socket输出流 , 输入流
OutputStream outputStream = client.getOutputStream();
InputStream inputStream = client.getInputStream();
byte[] buffer = new byte[];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer); // int
int i = ;
byteBuffer.putInt(i); // String
String str = "Hello你好!";
byteBuffer.put(str.getBytes()); // 发送到服务器
outputStream.write(buffer, , byteBuffer.position()); // 接收服务器返回
int read = inputStream.read(buffer);
System.out.println("收到数量:" + read); // 资源释放
outputStream.close();
inputStream.close();
}
}

socket.setSoTimeout(1000);的更多相关文章

  1. Socket 参数笔记

    //服务端@RunWith(JUnit4.class) public class ServerSocketTest { @Test public void testServer() throws IO ...

  2. 向继电器发送socket请求(python+java)

    近日,有一需求,向连接在内网的继电器发送socket请求,加以控制.原本并不复杂,只是io流/socket转换的问题,实操中却出现python代码没问题,java代码执行无响应的问题,问题很好定位:没 ...

  3. Java socket保存示例(不使用base64)解决中文乱码问题

    MultiThreadServer.java package com.my.nubase64; import java.io.BufferedReader; import java.io.Buffer ...

  4. Java Socket网络编程Server端详解

    Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网 ...

  5. 网络通信简单实例BIO,NIO,AIO

    这里,我将做一个简单的通信程序,分别使用三种原始的通信工具:BIO,NIO,AIO. 功能就是一个服务器,一个客户端.服务器就是处理请求,返回响应.而客户端就是连接服务器,发送请求,接收响应. 第一步 ...

  6. 简约之美Jodd-http--应用一箩筐

    Jodd-http是一个微型的.简约的http client,然而简单而且方便.使用它可以轻松的实现发送请求和读取响应.它的目标就是日常应用变的非常简单,从而简化开发人员的工作. 了解Jodd-htt ...

  7. Java 可中断线程

    PART.1 无法中断的线程 一个无法中断的线程的例子. public class UninterruptableThread { @SuppressWarnings("deprecatio ...

  8. parameter "timeout" in socketchannel does not work

    // Accept the connection and make it non-blocking SocketChannel socketChannel = serverSocketChannel. ...

  9. Java网络编程学习A轮_04_TCP连接异常

    参考资料: https://huoding.com/2016/01/19/488 示例代码: https://github.com/gordonklg/study,socket module A. C ...

随机推荐

  1. SpringBoot史前简述

    背景 大约20年前,程序员们使用“企业级Java Bean”(EJB)开发企业应用,需要配置复杂的XML. 在二十世纪初期,新兴Java技术——Spring,横空出世.使用极简XML和POJO(普通J ...

  2. 新浪IP库地址

    新浪IP库地址 http://int.dpool.sina.com.cn/iplookup/iplookup.php

  3. qW3xT.2,解决挖矿病毒。

    网站在运行期间感觉怪怪的,响应速度慢的不是一丁半点,带宽5M,不该是这样的呀 于是登录Xshell top命令 查看cpu情况如下 PID为3435的进程占用CPU过大,难道被病毒入侵了吗? 查看该进 ...

  4. canvas-6shadow.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. cf438E. The Child and Binary Tree(生成函数 多项式开根 多项式求逆)

    题意 链接 Sol 生成函数博大精深Orz 我们设\(f(i)\)表示权值为\(i\)的二叉树数量,转移的时候可以枚举一下根节点 \(f(n) = \sum_{w \in C_1 \dots C_n} ...

  6. 2018-08-13 中文编程讨论组(GitHub)社区守则一周年修订

    原址在此 社区守则 大原则 求同存异 就事论事 己所不欲勿施于人 注: 在讨论组成立一周年之际, 对行为规范进行一些细化 内 这部分所有内容同样适用于对外 回归技术 所有与中文编程没有直接关系的话题都 ...

  7. 小技巧:在线生成按钮Shape的网站

    AndroidButton Make  右侧设置按钮的属性,可以即时看到效果,并即时生成对应的.xml 代码,非常高效(当然熟练的话 自己手写代码更快)

  8. 四. Redis事务处理

    Redis目前对事务的支持还是比较简单,Redis能保证一个Client发起的事务中的命令可以连续执行,而中间不会插入其他Client的命令:当一个Client在连接中发起一个multi命令的时候,这 ...

  9. Android内存优化(五) Lint代码扫描工具

     1.使用 工具栏 -> Analyze -> Inspect Code… 点击 Inspect Code 后会弹出检查范围的对话框: 默认是检查整个项目,我们可以点击 Custom sc ...

  10. Testlink1.9.17使用方法(第一章 前言)

    第一章 前言 QQ交流群:585499566 一.Testlink主要功能: 测试项目管理 测试需求管理 测试用例管理 测试计划的制定 测试用例对测试需求的覆盖管理 测试用例的执行 大量测试数据的度量 ...