java socket 客户端设置未接收到数据的超时问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java socket 客户端设置未接收到数据的超时问题相关的知识,希望对你有一定的参考价值。

服务端是别人写的这里改不了;这里是一个网页,通过点按钮触发从客户端发送一个消息到服务端,然后客户端从服务端接收返回的消息反馈到网页上。
当然前面是背景不是重点……
现在想问一个问题就是:如何在客户端设置一个超时时间,发送消息过去之后一段时间没有接收到服务端返回的信息就断开这个连接???
现在已经确定服务端是卡在某个地方只有格式正确才能继续下去,但是人家服务端是封装的,不让改……
已经被这个卡了一个多月了,若有指点,不甚感激!解决必加分!
确定是socket,至于更新web则是通过ajax传数据,首先web传到后台,然后调用socket发送信息到服务端,服务端做出响应返回客户端,再return回前台页面,本质还是socket上的问题,这不是关键,只是介绍一下背景,说明无权更改服务端;然后,我已经在网上搜了好久,这个timeout设置应该是有的,但是现在代码卡在:BufferedReader is = new BufferedReader(new InputStreamReader(sendsocket.getInputStream()));这句上了,前面一句是:senddos.write(tempByte);senddos.flush();用来向服务端发送数据,现在是服务端卡死了,目标是在客户端这边做出设置,使得客户端可以在超出设置超时时间后未得到响应则自行断开连接;现在想求的就是这一段的具体代码,什么方法都可以,只要能在客户端达到上面提出的目的……不胜感激再具体请移步http://zhidao.baidu.com/question/175904057955128964.html

建议如果是长时间没有收到数据的话,或者是不想长时间等待的话,都可以通过设置超时时间来进行断开连接,之后继续处理逻辑(设置socket的setSoTimeout方法实现即可,时间单位是毫秒):

package socket;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
public class SocketService 
public static void main(String[] args) 
try 
SocketAddress address = new InetSocketAddress("192.168.9.155", 3000);
// 启动监听端口 8001
ServerSocket ss = new ServerSocket();
ss.bind(address);
// 接收请求
Socket s = ss.accept();
new Thread(new T(s)).start();
 catch (Exception e) 
e.printStackTrace();



class T implements Runnable 
public void run() 
try 
System.out.println(socket.toString());
socket.setKeepAlive(true);
socket.setSoTimeout(5 * 1000);
String _pattern = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat format = new SimpleDateFormat(_pattern);
while (true) 
System.out.println("开始:" + format.format(new Date()));
try 
InputStream ips = socket.getInputStream();
ByteArrayOutputStream bops = new ByteArrayOutputStream();
int data = -1;
while((data = ips.read()) != -1)
System.out.println(data);
bops.write(data);

System.out.println(Arrays.toString(bops.toByteArray()));
catch(SocketTimeoutException e)
e.printStackTrace();
catch(SocketException e)
e.printStackTrace();
 catch (Exception e) 
e.printStackTrace();

Thread.sleep(1000);
System.out.println(socket.isBound()); // 是否邦定
System.out.println(socket.isClosed()); // 是否关闭
System.out.println(socket.isConnected()); // 是否连接
System.out.println(socket.isInputShutdown()); // 是否关闭输入流
System.out.println(socket.isOutputShutdown()); // 是否关闭输出流
System.out.println("结束:" + format.format(new Date()));

 catch (Exception e) 
e.printStackTrace();


private Socket socket = null;
public T(Socket socket) 
this.socket = socket;

public Socket getSocket() 
return socket;

public void setSocket(Socket socket) 
this.socket = socket;

参考技术A 首先,确定你这是socket连接吗? 通过socket的连接然后去更新 web页面?

然后,不管是socket 还是 http连接, 都是有timeout时间设置的。追问

非常感谢您的回答,但是具体代码上面的问题我自己无法解决,问题补充大致说明了一下情况,如果再具体请移步http://zhidao.baidu.com/question/359893174320771692.html,谢谢

本回答被提问者采纳

java是如何实现聊天功能的?

Java可以使用Socket编程实现聊天功能。Socket是一种网络通信协议,它可以在不同的主机之间传输数据。在聊天功能中,一般有客户端和服务器两个角色。
客户端是发送消息的一方,它需要创建一个Socket对象,指定要连接的服务器的IP地址和端口号。然后,客户端通过Socket对象的输入输出流向服务器发送和接收消息。在接收消息时,客户端需要启动一个线程不断监听服务器的消息,并将接收到的消息展示给用户。
服务器端则是接收和转发消息的一方。服务器需要创建一个ServerSocket对象,指定监听的端口号。当有客户端连接到服务器时,服务器通过Socket对象的输入输出流向客户端发送和接收消息。在接收到客户端的消息后,服务器需要将消息转发给其他客户端,以实现聊天室的功能。
需要注意的是,在聊天功能中,数据的传输是通过网络进行的,因此需要考虑数据传输的稳定性和安全性。例如,可以使用加密算法对聊天数据进行加密,确保聊天数据的安全性。此外,在多用户同时连接的情况下,还需要考虑服务器的并发处理能力。
参考技术A

Java实现聊天功能通常需要使用Socket编程。Socket是一种用于在不同设备之间进行网络通信的编程接口,可以通过网络实现不同设备之间的通信。

具体实现步骤如下:

    创建服务器端程序:创建一个服务器端程序来监听客户端的请求,并处理客户端发送的数据。可以使用Java中的ServerSocket类来实现服务器端程序。

    创建客户端程序:创建一个客户端程序来连接服务器,并向服务器发送数据。可以使用Java中的Socket类来实现客户端程序。

    编写聊天程序的逻辑:在客户端和服务器端之间进行交互的时候,需要遵循一定的协议。可以定义一种协议来规定数据的格式和交互的方式。

    实现聊天功能:一旦建立了客户端和服务器端之间的连接,就可以开始发送和接收数据了。在聊天过程中,可以使用Java中的输入输出流来传输数据。

参考技术B java实现客服在线聊天功能一般都是用第三方IM sdk来搭建的,像即构科技的SDK比较成熟,使用到目前已经将近一年了,感觉很满意,ZEGO即构IM可以为开发者提供全平台互动、海量并发、超低延时、消息必达的通信服务,助力打造大型直播、语聊房、客服系统等场景。本回答被提问者采纳

以上是关于java socket 客户端设置未接收到数据的超时问题的主要内容,如果未能解决你的问题,请参考以下文章

socket.io 客户端未从服务器接收消息

socket接收汉字问题

客户端未使用 websockets 接收所有消息

java或者scala写socket客户端发送头消息和消息体到服务端并接收返回信息,这个头消息怎么写

Web Socket 消息未全部接收

Java Socket通信之客户端程序 发送和接收数据