답답한 socket 재연결 문제

3305 단어 .netsocketGoogleUP
최근에 socket 프로세스를 하는 것은 주 프로젝트가 하나의 단일 클라이언트 socket 클래스를 유지하고 일부 조작을 실행할 때 이 클라이언트 socket을 통해 서버에 다음과 같이 통지하는 것이다
package com.common.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
public class UtilSocket {
	private static final UtilSocket INSTANCE = new UtilSocket();
	private final String host = "192.168.1.201";
	private final int port = 4321;
	private  BufferedReader socketReader;
	private PrintWriter socketWriter;
    private Socket client = null;
	
    private UtilSocket() {
    	connServer();
    	System.out.println(" UtilSocket!");
	}
    
    public static UtilSocket getInstance() {
    	if(INSTANCE.client == null || INSTANCE.client.isClosed()){
    		INSTANCE.downServer();
    		INSTANCE.connServer();
    	}
		return INSTANCE;
	}
    
    // 
    public void connServer() {
        try {
            client = new Socket(host,port);
            socketReader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
            socketWriter = new PrintWriter(client.getOutputStream(),true);
        } catch(UnknownHostException e) {
            System.out.println("Error1 setting up socket connection: unknown host at "+host+":"+port);
        } catch(IOException e) {
            System.out.println("Error2 setting up socket connection: "+e);
        }
    }
    
    // 
    public void downServer() {
        try {
            socketWriter.close(); 
            socketReader.close();
            client.close();
        }catch(IOException e) {            
            System.out.println("Error tearing down socket connection: "+e);
        }
    }
    
    
    // 
    public void putInfo(String str) {
        try {
            socketWriter.println(str);
        }
        catch(Exception e) {
            System.out.println("Error reading from file: "+str);
        }
    }

}

 
테스트 후 문제가 발생했습니다. 소켓 서버가 메인 프로젝트를 다시 시작하지 않으면 문제없습니다. 하지만 소켓 서버가 메인 프로젝트를 다시 시작하지 않으면 보내는 소켓 요청 소켓 서버는 정보를 전혀 받지 못합니다.자세히 생각해 보니 socket 서버가 끊겼고 주 프로젝트에서는 원격 서버가 연결을 끊었는지 어떻게 판단하는지 알 수 없습니다. 끊으면 다시 연결해야 합니다.우선 socket 클래스의 방법인 isClosed (), isConnected (), isInput Stream Shutdown (), isOutput Stream Shutdown () 등을 생각하지만 테스트를 통해 관련 문서를 보십시오. 이 방법들은 모두 로컬의 상태이기 때문에 원격에서 연결이 끊겼는지 판단할 수 없습니다.그리고 OutputStream을 통해 테스트 데이터를 보낼 수 있는지 생각해 보세요. 전송에 실패하면 원단이 연결이 끊어진 것을 나타냅니다. ping과 유사하지만 이렇게 하면 정상적인 출력 데이터에 영향을 주고 원단은 정상적인 데이터와 테스트 데이터를 분리할 수 없습니다.마지막으로 구글은 내가 만났던 것과 똑같은 문장이 있는 것을 발견하고sendUrgentData를 사용했다. 문서를 보면 출력으로 바이트의 데이터를 전송할 수 있다는 것을 알게 되었다. 상대방 Socket의 SO_만 있으면OOBINLINE 속성이 열리지 않으면 자동으로 이 바이트가 무시되고 SO_OOBINLINE 속성은 기본적으로 닫힙니다.그리고 실례를 얻는 방법을 수정하여 문제를 해결했다!(~ o ~)~zZ
 
 
   public static UtilSocket getInstance() {
    	if(INSTANCE.client == null || INSTANCE.client.isClosed()){
    		INSTANCE.downServer();
    		INSTANCE.connServer();
    	}
    	try{
    		INSTANCE.client.sendUrgentData(0xFF);
    	}catch(Exception ex){
    		System.out.println(" ! !");
    		INSTANCE.downServer();
    		INSTANCE.connServer();
    	}
		return INSTANCE;
	}
    
 
 
 

좋은 웹페이지 즐겨찾기