我遇到了Java套接字API的一些问题.我正在尝试显示当前连接到我的游戏的玩家数量.很容易确定玩家何时连接.但是,确定玩家何时使用套接字API断开连接似乎不必要.
调用isConnected()已远程断开的套接字似乎总是返回true.同样,调用isClosed()已远程关闭的套接字似乎总是返回false.我已经读过,要实际确定套接字是否已关闭,必须将数据写入输出流并且必须捕获异常.这似乎是处理这种情况的一种非常不洁净的方式.我们不得不经常通过网络垃圾邮件垃圾邮件,以便知道套接字何时关闭.
还有其他解决方案吗?
我试图找出Java TCP套接字当前是否已连接,以下似乎只是告诉我套接字是否已经连接 - 而不是它当前是否仍然连接.
socket.isConnected();
Run Code Online (Sandbox Code Playgroud)
任何帮助表示感谢,谢谢.
我的聊天应用程序连接到服务器,用户发送/接收信息.当连接改变时,例如3g-> wifi,wifi-> 3g,丢失数据连接等,套接字有时会在断开连接之前保持连接数年.在此期间,无法判断连接是否仍处于活动状态,似乎消息发送得很好.其他时候,在发送消息时,它会抛出IO错误并断开连接.
除了实现代码来检测连接更改并正确地重新连接之外,是否可以让套接字在连接发生变化时立即抛出IO异常?
编辑:我正在使用以下代码进行连接:
Socket sock = new Socket();
sock.connect(new InetSocketAddress(getAddress(), getPort())), getTimeout());
//get bufferedReader and read until BufferedReader#readLine() returns null
Run Code Online (Sandbox Code Playgroud)
我没有使用setSoTimeout,因为根据远程服务器的配置,数据可能无法长时间传输.
我有一个Android设备,使用java.net.Socket与PC无线通信.一切都很好,但如果我没有做任何事情(即没有网络使用)正好1分钟,那么当Android向PC发送数据包时,PC会收到它并发送一个ACK,但Android会以RST响应.
来自Wireshark(10.1.2.1是Android,10.1.2.11是PC)......
356 0.112470 10.1.2.1 10.1.2.11 TCP 97 34360→181 [PSH,ACK] Seq = 1 Ack = 1 Win = 4935 Len = 31 TSval = 156103571 TSecr = 320673352
359 0.000011 10.1.2.11 10.1.2.1 TCP 66 181→34360 [ACK] Seq = 1 Ack = 32 Win = 260 Len = 0 TSval = 320738236 TSecr = 156103571
360 0.000304 10.1.2.1 10.1.2.11 TCP 60 34360→181 [RST] Seq = 32 Win = 0 Len = 0
在这一点上,如果我询问套接字的成员变量,它说...
我有一个带Socket的java程序.我需要检查客户端是否已断开连接.我需要一个例子来做到这一点.我研究过,但我不明白.所以有人可以制作示例代码并解释所有内容.
对不起英语我的代码:
package proov_server;
//SERVER 2
import java.io.*;
import java.net.*;
class server2 {
InetAddress[] kasutaja_aadress = new InetAddress[1000];
String newLine = System.getProperty("line.separator");
int kliendiNr = 0;
int kilene_kokku;
server2(int port) {
try {
ServerSocket severi_pistik = new ServerSocket(port);
System.out.println("Server töötab ja kuulab porti " + port + ".");
while (true) {
Socket pistik = severi_pistik.accept();
kliendiNr++;
kasutaja_aadress[kliendiNr] = pistik.getInetAddress();
System.out.println(newLine+"Klient " + kliendiNr + " masinast "
+ kasutaja_aadress[kliendiNr].getHostName() + " (IP:"
+ kasutaja_aadress[kliendiNr].getHostAddress() + ")");
// uue kliendi lõime …Run Code Online (Sandbox Code Playgroud)