ジャワ:ソケットの再接続が時々エラーになります
-
21-08-2019 - |
質問
私は、プロトタイプのクライアント&サーバーを作っています。
サーバはServerSocketをを作成し、永遠に聞くべきです。クライアントは、接続してデータを送信し、そのソケットを閉じますが、それは「私が行われ、閉じている」サーバーへのタイプのメッセージを送信しませんがあります。このため、サーバーは、リモートクライアントが閉じているので、それはEOFException
を行うreadByte()
を取得します。 EOFException
のためのエラーハンドラでは、ソケットを閉じて、新しいものを開きます。
ここで問題があります:クライアントは、時にはそれが成功したソケット/入力ストリーム/ outpustreamを開いた後でさえもSocketWriteError
呼び出しを行いoutputStream.write()
を取得します。それは私がこれらのソケットを開閉していた周波数とは何かを持っていることがあります。一つ興味深いのは、クライアントが出てcrapping前に再接続/クローズ書き込み/任意の数をしていることです。それは時々、他の回は、それがSocketWriteError
を見る前に50の再接続を行う最初の再接続、上のがらくたされます。
ここでは、クライアント側のエラーがあります:
java.net.SocketException: Connection reset by peer: socket write error at java.net.SocketOutputStream.socketWrite0(Native Method) at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) at java.net.SocketOutputStream.write(SocketOutputStream.java:115) at bytebuffertest.Client.main(Client.java:37)
ここでは、コードの一部抜粋は次のとおりです:
SERVER:
public static void main(String[] args)
{
Server x = new Server();
x.initialize();
}
private void initialize()
{
ServerSocket s;
InputStream is;
DataInputStream dis;
while (true) //ADDED THIS!!!!!!!!!!!!!!!!!!!!!!
{
try
{
s = new ServerSocket(4448);
s.setSoTimeout(0);
s.setReuseAddress(true);
is = s.accept().getInputStream();
System.out.println("accepted client");
dis = new DataInputStream(is);
try
{
byte input = dis.readByte();
System.out.println("read: " + input);
} catch (Exception ex)
{
System.out.println("Exception");
dis.close();
is.close();
s.close();
}
} catch (IOException ex)
{
System.out.println("ioexception");
}
}
}
CLIENTます:
public static void main(String[] args)
{
Socket s;
OutputStream os;
try
{
s = new Socket("localhost", 4448);
s.setKeepAlive(true);
s.setReuseAddress(true);
os = s.getOutputStream();
int counter = 0;
while (true)
{
try
{
os.write((byte) counter++);
os.flush();
os.close();
s.close();
s = new Socket("localhost", 4448);
s.setKeepAlive(true);
s.setReuseAddress(true);
os = s.getOutputStream();
} catch (Exception e)
{
e.printStackTrace();
System.err.println("ERROR: reconnecting...");
}
}
} catch (Exception ex)
{
ex.printStackTrace();
System.err.println("ERROR: could not connect");
}
}
誰もが正常に再接続する方法を知っていますか?
解決
)(ただ.accept、エラー時に新しい接続をServerSocketを閉じないでください。
私は正常にやっていることはServerSocket.acceptは()ソケットを返すたびに、私は送信し、そのソケットからの受信を処理するスレッドをオフに産卵。あなたは、すぐに誰かがあなたに接続したいと、新しい接続の受け付けを開始する準備が整いましたその方法ます。