簡體   English   中英

如何將數據服務器(用JAVA編寫)發送到客戶端(用Node.js編寫)

[英]How to send data server (written in JAVA) to client (Written in Node.js)

我不知道這是不可能的,首先我在Node.js中編寫了客戶端和服務器,然后在Java中編寫了服務器和客戶端,這些都按預期工作了。 現在,我對連接Java服務器和Node.js客戶端感興趣。 但是問題是他們之間無法發送日期

這是用Java編寫的服務器端代碼

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class MyServer {

    public MyServer() {
    }
    public static void main(String args[]){
        ServerSocket serverSocket= null;
        Socket socket =null;
        DataInputStream datainputstream=null;
        DataOutputStream dataoutputstream=null;
        try{
            serverSocket = new ServerSocket(8888);
            System.out.println("Listening ...");
        }catch(IOException e){
            e.printStackTrace();
    }
    while(true){
        try{
            socket = serverSocket.accept();
            datainputstream = new DataInputStream(socket.getInputStream());
            dataoutputstream = new DataOutputStream(socket.getOutputStream());
            System.out.println("ip:"+socket.getInetAddress());
            System.out.println("message:"+datainputstream.readUTF());
            dataoutputstream.writeUTF("HELLO !");
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(socket!=null){
                try{
                    socket.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(datainputstream!=null){
                try{
                    datainputstream.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(dataoutputstream !=null){
                try{
                    dataoutputstream.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
        }
        }
    }

}

這是用Node.js編寫的客戶端代碼

 var net = require('net');
var HOST = '127.0.0.1';
var PORT = 8888;
var client = new net.Socket();
client.connect(PORT, HOST, function() {
        console.log('connected to: ' + HOST + ':' + PORT);
        client.write('Data comming from client...');

});
client.on('data', function(data) {
        console.log(data.toString());
        //client.destroy();
});
client.on('close', function() {
        console.log('Connection closed');
});

您的服務器(Java)在發送任何內容之前都需要來自客戶端的消息。 它將阻塞直到它收到這樣的消息。 由於服務器似乎未接收到該消息,因此客戶端實際上沒有在發送消息(即正在排隊,直到接收到更多要發送的數據為止),或者服務器期望接收到更多數據。

DataInputStream.readUTF()的文檔聲稱它需要使用長度前綴的字符串。 那不是你的客戶在寫什么。 服務器可能會將字符串的前兩個字節解釋為一個長度,然后嘗試讀取那么多字節的數據,由於沒有那么多數據可用,因此它將等待來自客戶端的更多數據。 嘗試改用BufferedReader.readLine() ,並確保客戶端在其輸出末尾發送換行符。

如果那不起作用,請嘗試尋找一種方法來刷新客戶端上的套接字。 我不知道Node.js,但是快速瀏覽一下文檔表明socket.end()可能會有所幫助,盡管如果以后需要發送更多的數據將無法正常工作。

這是解決方案

服務器端代碼

 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.net.ServerSocket;
 import java.net.Socket;
 import java.io.BufferedInputStream;
 import java.io.*;

public class MyServer {

public MyServer() {

}
public static void main(String args[]){
    ServerSocket serverSocket= null;
    Socket socket =null;
    BufferedReader datainputstream=null;

    try{
        serverSocket = new ServerSocket(8888);
        System.out.println("Listening ...");
    }catch(IOException e){
        e.printStackTrace();
    }
    try{
        socket = serverSocket.accept();

    }catch(IOException e){
            System.out.println("can't listen given port \n");
            System.exit(-1);
    }
    try{
        datainputstream = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        System.out.println("ip:"+socket.getInetAddress());
    }catch(IOException e){
            System.out.println("can't read File \n");
            System.exit(-1);
    }

        try{


            StringBuilder sb = new StringBuilder();
            String line = null;
            while((line=datainputstream.readLine())!=null){
                sb.append(line+"\n");
            }
            datainputstream.close();
            System.out.println("message:"+sb.toString());

        }catch(IOException e){

            System.out.println("Cant read file \n");
        }finally{
            if(socket!=null){
                try{
                    socket.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }
            if(datainputstream!=null){
                try{
                    datainputstream.close();
                }catch(IOException e){
                    e.printStackTrace();
                }
            }

        }

}



   }

這是我的客戶

客戶端代碼

var net = require('net');
var client = net.connect(8888, 'localhost');
client.write('Hello from node.js');
client.end();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM