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 ...
随机推荐
- mysql各种操作记录
MySQL设置数据集为UTF8仍无法输入中文的解决办法: mysql -uroot -p --default-character-set=gbk 可用命令status 和 show variables ...
- 谈谈知识的融会贯通:以“java中的迭代器失效问题”为例
提示 文中涉及知识点: Collection . Iterator Guava 中的 Lists.partition 方法 如果你对这两个知识点不了解,强烈建议阅读文中引用的参考文章. 场景一:以Ar ...
- oracle中row_number() over()
ROW_NUMBER() OVER函数的基本用法语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)简单的说row_number()从1开 ...
- IBM沃森会成为第一个被抛弃的AI技术吗?
作者|William Vorhies 译者|姚佳灵 编辑|Debra 导读:IBM 的沃森问答机(Question Answering Machine,简称 QAM),因 2011 年参加综艺节目&l ...
- Tomcat_记一次tomcatwar包应用简单部署过程
记一次tomcat war包应用简单部署过程 by:授客 QQ:1033553122 1. 实践环境 Linux apache-tomcat-7.0.73 2. 实践步骤 # 解压tomcat压缩 ...
- Android样式主题及自定义属性
一.Selector——图形.颜色选择器 语法 <selector> <item android:drawable=“drawableResA” android:state_xx ...
- Python高级特性:列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 最常见的例子: 生成list [, , , , , , , , , ]可以用li ...
- Android项目实战(四十七):轮播图效果Viewpager
简易.常用的轮播图效果ViewPager ,老技术了,记一笔留着以后ctrl C + ctrl V 需求如下: 不定张个数的ImagView轮播,右下角显示轮播点图标,每隔固定时间切换下一张,最 ...
- Android开发学习之RecyclerView
1.在app/build.gradle中添加RecyclerView依赖 implementation 'com.android.support:recyclerview-v7:28.0.0' 注意依 ...
- Python 爬虫实例(爬百度百科词条)
爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入 ...