輸入java.io.BufferedWriter。 インポートにjava.io.IOException; 輸入java.io.InputStreamを。 インポートにjava.io.OutputStream; 輸入java.io.OutputStreamWriterが、 輸入java.net.InetSocketAddress。 インポートのjava.net.Socket; 輸入はjava.util.ArrayList; 輸入はjava.util.List; パブリック クラスSocketClient { パブリックソケットソケット= NULL ; 公共のOutputStreamのOutputStream = nullを。 公共のOutputStreamWriterのOutputStreamWriter = nullを。 公共 BufferedWriterのbufferWrite = nullを。 公共 InputStream InputStreamは= nullを。 公共 SocketState socketState = SocketState.Closed。 公共スレッドsocketThread = nullを。 公共の一覧<文字列> protocolList = 新しいArrayListを(); プライベート 静的 ブール closeSocket = 偽; 公共 ボイドcloseSocket(){ closeSocket = 真。 socketThread = nullを。 } 公共 ボイドconnectSocket(){ startThread()。 } 公共 ボイドsendProtocolAPI(文字列プロトコル){ protocolList.add(プロトコル)。 } プライベート ボイドstartThread(){ 場合(socketThread == NULL ){ socketThread = 新しいスレッド(){ 公共 ボイドRecivce(文字列プロトコル){ // Protocol.ParseProtocol(プロトコル)。 } 公共 ボイドラン(){ バイト[] =バッファ新しい バイト [を'?' ]; しばらく(真){ しようと{ 場合(closeSocket){ closeSocket = 偽; してみてください{ 場合(!ソケット= ヌル){ socket.close(); } } キャッチ(IOExceptionをlocalIOException1){ } ソケット socketState){ = nullを。 OutputStreamを = nullを。 OutputStreamWriter = nullを。 inputStream = nullを。 System.gc(); socketState = SocketState.Closed。 破ります; } の場合(SocketState.Connected =! socketState = SocketState.Connecting。 ソケット = 新しいソケット(); たInetSocketAddress IPA = 新たInetSocketAddress(Config.IP、Config.Port)。 socket.connect(IPA、 500 )。 出力ストリーム = socket.getOutputStream()。 OutputStreamWriter = 新しいのOutputStreamWriter(OutputStreamの); bufferWrite = 新しいBufferedWriterの(のOutputStreamWriter)。 InputStreamの = socket.getInputStream(); socket.setTcpNoDelay(真)。 socket.setKeepAlive(真の); socketState = SocketState.Connected。 Thread.sleep( 1000L )。 } であれば(SocketState.Connected == socketState){ 場合(protocolList.size()> 10 ){ protocolList.removeAll(protocolList)。 } 他 場合(protocolList.size()> 0){ 一方(protocolList.size()> 0 ){ bufferWrite.write(protocolList.get( 0 ))。 bufferWrite.flush(); protocolList.remove( 0 )。 Config.PaySDKAPI.ReceiveTcpLinkAPI(Config.IP、Config.Port)。 } } } } キャッチ(例外e){ socketState =SocketState.Closed; 試す{ のThread.sleep( 5000L )。 } キャッチ(InterruptedExceptionあるlocalInterruptedException){ } } 試みる{ 場合((のinputStream!= NULL)&&(SocketState.Connected == socketState)){ int型 READSIZE = inputStream.read(バッファ) もし(READSIZE> 0 ){ Recivce(新しい文字列(バッファ、0 、READSIZE))。 } } } キャッチ(IOExceptionを電子){ socketState = SocketState.Closed。 } } } }。 socketThread.start(); } } }