[英]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.