当前位置: 首页 > 知识库问答 >
问题:

使用DataOutputStream将消息写入客户端套接字到服务器套接字只在关闭客户端套接字后发送,为什么?

何浩荡
2023-03-14

我用Java编写了套接字客户端程序。我正在使用DataOutputStream向服务器套接字发送消息。有时DataOutputstream上的writed消息不会发送到ServerSocket。我想是因为我发了信息后没有脸红。我这样做,但没有用。如果我终止类执行,那么只有我从ServerSocket接收消息。

我的代码

public class LoggingClient {


LinkedBlockingQueue<byte[]> messages = new LinkedBlockingQueue<byte[]>();

public static LoggingClient clientObj;

/*
 * waiting 2 seconds for connecting centralized log server . If it's not reachable writing log's in local machine
 * this log's will be collected on eclipse restart.
 */
public static final int SOCKET_TIMEOUT = 2000;
/**
 * Server which the log server is currently running.
 */
public static final  String SERVER = "bharathi";
/**
 * Port which the log server is running.
 */
public static final int PORT = 10000;

/**
 * Client socket used to connect the server .
 */
Socket client = null;

public static Logger logger = Logger.getLogger(LoggingClient.class.getName());


/**
 * Used to write given logs into client output stream.
 */
DataOutputStream out = null;

public boolean isConnected = false;

/**
 * Used for preventing instaniate LoggingClient without calling getInstance method.
 */
private LoggingClient(){

}

/**
 * Clear's the socket and initialize new socket .
 */
public void init(){
try{
    clear();
    client = new Socket();
        client.setTcpNoDelay(true);
    client.connect(new InetSocketAddress(SERVER,PORT),SOCKET_TIMEOUT); //trying to make connection within two seconds.
    out = new DataOutputStream(client.getOutputStream());
    isConnected = true;
}catch(Exception e){
    isConnected = false;
}
}

public static LoggingClient getInstance(){
if(clientObj == null){
    clientObj = new LoggingClient();
}
return clientObj;
}

public void clear(){
try{
    if(out != null){
    out.close(); //if we call close method it invokes flush and then closes the DataOutputStream.
    }

    if(client != null){
    client.close();
    }
}catch(Exception e){
    logger.log(Level.INFO,"Error while closing connection , reason {0}",e);
}finally{
    try{
    client.close();
    out.close();
    }catch(Exception e){

    }
    isConnected = false;
}
}


/**
 * Adding this message into a queue . Scheduled thread will get this logs and push into central logging server.
 * @param message
 */
public synchronized void write(byte[] message){
if(!isConnected){ //has connection.
    init();
}
messages.add(message); //adding message to this queue . Background thread will collect the log message and sent it to the central log server.
}

/**
 * Sending logs into central log server . If it's not reachable write into local machine.
 * @param message
 */
public void sendLog(byte[] message){
try {
    out.write(message);
    out.flush();
} catch (Exception e) {
    writeInLocalMachine(localLoggingPath, message); //in case of failure writing logs in local machine . Sync this logs when restart of eclipse.
}
}

/**
 * Writing log's into his machine this log will be synced on plugin startup.
 * @param file - File path.
 * @param message - Message  to log.
 */
public static void writeInLocalMachine(String file, byte[] message) {
FileOutputStream fileWriter = null;
File f = new File(file);
try {
    if(!f.exists()){
    f.createNewFile();
    }
    fileWriter = new FileOutputStream(file, true);
    fileWriter.write(message);
    fileWriter.flush();
} catch (Exception e) {
   logger.log(
        Level.WARNING,
        "This may be due to given file not found in system , reason {0}",
        e);
} finally {
    try{
    fileWriter.close();
    }catch(Exception e){

    }
}
}

/**
 * @return - Recently received message from queue . Returns null if it's empty.
 */
public byte[] getMessage(){
return messages.poll(); //returns the head element and deletes it.
}
public class LogTest implements Runnable {

public static final String LINE_SEPARATOR = System.getProperty("line.separator");


@Override
public void run() {
while(true){
    try{
        LoggingClient client = LoggingClient.getInstance();
        byte[] message = client.getMessage();
        if(message != null){
            client.sendLog(message);
        }
    }catch(Exception e){

    }
}
}

public static void startSending(){
for(int i=0;i<10000;i++){
    String msg = "msg number" + i+LINE_SEPARATOR;
    LoggingClient.getInstance().write(msg.getBytes());
}
}

public static void main(String args[]){
    LoggingClient c = LoggingClient.getInstance();
    System.out.println("START TIME " + System.currentTimeMillis());
    Thread t = new Thread(new LogTest(),"LOG MESSAGER");
    t.start();
    startSending();
    System.out.println("END TIME " + System.currentTimeMillis());
}
START TIME 1340815857896
END TIME 1340815858063

已完成将消息放入队列。无限while循环将负责向服务器套接字发送日志。

文件中存储的内容是0字节为什么?.如果我停止运行类,我会收到发送的消息,为什么?

共有1个答案

谢墨竹
2023-03-14

您已经发布了太多的代码,但是在这些情况下,100次中有99次您只在流/程序关闭后才看到数据,您的问题是您从来没有在写入数据后刷新数据

 类似资料:
  • 我正在使用网络库和浏览器上的WebSocket实现一个套接字节点服务器。我正在成功使用telnet,但浏览器工作不正常。浏览器成功连接到套接字服务器并发送消息。我的服务器实现了一个事件,并立即触发和事件<代码>关闭,事件在断开连接时执行删除客户端(关闭浏览器,连接松动…)。 我不希望浏览器发送消息,然后断开连接。有人知道问题出在哪里吗? 套接字服务器 客户端(浏览器) 浏览器连接到服务器时的输出

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 我有套接字服务器(java桌面应用程序)正在等待从java webapp(套接字客户端)连接。通信看起来还可以,我在客户端看到来自服务器的消息,但是当我发送消息时,我在服务器端没有收到任何消息。会有什么问题呢?当我检查服务器与telnet,一切正常。下面是我的代码: 服务器: 客户: 谢谢帮忙!

  • 我正在编写一个简单的客户端/服务器套接字程序,其中客户端与服务器连接并通信,然后它们向服务器发送退出消息,然后服务器关闭连接。代码如下所示。 服务器.py client.py 我想要的是万一服务器通过ctrl-c或任何其他方式退出,我希望关闭所有客户端套接字,并将msg发送给客户端,他们也应该在其上关闭套接字。 我在下面除部分之外的部分做了一些工作,但由于某些原因,客户端没有收到服务器发送的消息。

  • 我正试图从套接字服务器(Java)向套接字客户端(Python)发送一个映像,但客户端中接收到的映像大小不正确,无法打开。我不知道我做错了什么。有什么建议吗?

  • 关于使用Java套接字的例子有上百万个——每个都是一样的!每一个都显示了一个正在创建的客户机套接字,一些文本正在发送,并且套接字已关闭。 我正在编写一些测试代码。我希望我的客户端循环并发送相当多的消息。每次关闭客户端套接字并重新创建似乎很傻,所以我想我只创建一个客户端套接字,循环循环并在同一个套接字上发送数据。问题是——我的服务器套接字不会打印出它收到的内容,直到客户端发送最后一条消息并且客户端套