socket.setSoTimeout(1000);
这个用来设置与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);的更多相关文章
- Socket 参数笔记
//服务端@RunWith(JUnit4.class) public class ServerSocketTest { @Test public void testServer() throws IO ...
- 向继电器发送socket请求(python+java)
近日,有一需求,向连接在内网的继电器发送socket请求,加以控制.原本并不复杂,只是io流/socket转换的问题,实操中却出现python代码没问题,java代码执行无响应的问题,问题很好定位:没 ...
- Java socket保存示例(不使用base64)解决中文乱码问题
MultiThreadServer.java package com.my.nubase64; import java.io.BufferedReader; import java.io.Buffer ...
- Java Socket网络编程Server端详解
Socket通信:分为客户端和服务端的socket代码. Java SDK提供一些相对简单的Api来完成.对于Java而言.这些Api存在与java.net 这个包里面.因此只要导入这个包就可以开始网 ...
- 网络通信简单实例BIO,NIO,AIO
这里,我将做一个简单的通信程序,分别使用三种原始的通信工具:BIO,NIO,AIO. 功能就是一个服务器,一个客户端.服务器就是处理请求,返回响应.而客户端就是连接服务器,发送请求,接收响应. 第一步 ...
- 简约之美Jodd-http--应用一箩筐
Jodd-http是一个微型的.简约的http client,然而简单而且方便.使用它可以轻松的实现发送请求和读取响应.它的目标就是日常应用变的非常简单,从而简化开发人员的工作. 了解Jodd-htt ...
- Java 可中断线程
PART.1 无法中断的线程 一个无法中断的线程的例子. public class UninterruptableThread { @SuppressWarnings("deprecatio ...
- parameter "timeout" in socketchannel does not work
// Accept the connection and make it non-blocking SocketChannel socketChannel = serverSocketChannel. ...
- Java网络编程学习A轮_04_TCP连接异常
参考资料: https://huoding.com/2016/01/19/488 示例代码: https://github.com/gordonklg/study,socket module A. C ...
随机推荐
- SpringMVC 与 REST.
一.REST 的基础知识 我敢打赌这并不是你第一次听到或读到REST这个词.当讨论REST时,有一种常见的错误就是将其视为“基于URL的Web服务”—— 将REST作为另一种类型的RPC机制,只不过是 ...
- 面试必会之HashMap源码分析
相关文章 面试必会之ArrayList源码分析 面试必会之LinkedList源码分析 简介 HashMap最早出现在JDK1.2中,底层基于散列算法实现.HashMap 允许 null 键和 nul ...
- 洛谷P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- IBM沃森会成为第一个被抛弃的AI技术吗?
作者|William Vorhies 译者|姚佳灵 编辑|Debra 导读:IBM 的沃森问答机(Question Answering Machine,简称 QAM),因 2011 年参加综艺节目&l ...
- MachineLN博客目录
MachineLN博客目录 https://blog.csdn.net/u014365862/article/details/78422372 本文为博主原创文章,未经博主允许不得转载.有问题可以加微 ...
- Activity切换的时候生命周期的变化
之前在做笔试题的时候遇到一个问题:Activity A切换到ActivityB时,A和B的生命周期变化. 事实上,它们的生命周期变化是这样的: 1.A的onPause()方法被执行. 2.B的onCr ...
- git 入门教程之个性化 git
前情概要 初识 git 时,我们就已经接触过 git 的基本配置,使用 git config 命令配置用户名和邮箱: # 配置当前项目(`local`)的用户名(`snowdreams1006`) g ...
- (后端)swagger
Swagger 文档提供了一个方法,使我们可以用指定的 JSON 或者 YAML 摘要来描述你的 API,包括了比如 names.order 等 API 信息. 你可以通过一个文本编辑器来编辑 Swa ...
- 关于PID的如何修改的FAQ
1.如何查询支付宝账号对应的PID: 2.意外绑错或者想修改PID流程: (1)和业务联系拿到商家平台支付宝变更协议书填写(模版如下,可在附件中下载) 致:杭州银盒宝成科技有限公司 本人因 ...
- jdk1.8新特性总结
一.引言 jdk1.8出来已经一段时间了,现在1.9也已经出来了,但是很多公司(我们公司也一样)不太愿意升级到高版本的jdk,主要是有老的项目要维护,还有升级的话配套的框架也要升级,要考虑的细节事情太 ...