我如何在 java 服务器和 java 脚本客户端之间使用套接字通信?
How can i use socket communication between java server and javascript client?
我正在尝试使用 socket.io 连接 java 服务器和 Javascript 客户端。当我在浏览器上看到调试器时,看起来好像正在接收数据,但我收到此错误:"Reason: CORS header 'Access-Control-Allow-Origin' missing" 并且我无法在客户端打印数据。
import...
public class MeuServerSocket {
//initialize socket and input stream
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
public MeuServerSocket(int port) {
// starts server and waits for a connection
try {
while(true){
server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
saida.flush();
// send available data from server to client
saida.writeObject("Texto enviado 123...");
// takes input from the client socket
in = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
String line = "";
// reads message from client until "Over" is sent
boolean fim = false;
while (!line.equals("Over") && !fim)
{
try
{
line = in.readUTF();
System.out.println(line);
}
catch(IOException i)
{
fim = true;
System.out.println(i.toString());
}
}
System.out.println("Closing connection");
// close connection
socket.close();
saida.close();
in.close();
}
} catch (IOException i) {
System.out.println(i);
}catch(Exception e){
System.out.println(e.toString());
}
}
public static void main(String[] args) {
MeuServerSocket server = new MeuServerSocket(5000);
}
}
var socket = io('http://localhost:5000');
socket.on('connect', function () {
socket.send('hi \nOver');
socket.on('get', function (msg) {
// my msg
console.log('msg: '+msg)
})
socket.on('disconnect',()=>{
console.log('disconnected')
})
})
当我查看 Firefox 网络时,我看到数据是在其中一个包中发送的...
TLDR: 使用 ws://...
而不是 http://...
。
详情:
https
用于HTTP协议。在这种情况下,浏览器首先询问您的服务器是否允许 CORS 是正确的。您尚未启用 CORS。所以浏览器拒绝发送CORS请求是正常的。
但是你说你想使用 Web Sockets。那么你应该使用ws://
,而不是http://
。对于 Web 套接字,没有 CORS 策略,浏览器将在没有 CORS 限制的情况下发送您的请求。
我在这里看到的最大问题是对 socket.io 的误解。 java 脚本的 Socket.io 与 java 中的套接字库不兼容。命名约定肯定会令人困惑。
socket.io 是一个与 web sockets (ws://) 相关的库。它实现了所有基本的 websocket 功能以及一些额外功能。
您的 java 代码是一个 TCP 套接字服务器。虽然 websockets 和 socket.io 是建立在 TCP 套接字上的,但您不能将 socket.io 客户端连接到 "naked" 套接字服务器。
解决方案:
如果您的 java 脚本是来自 nodejs 的 运行,您可以使用他们找到的网络库 here。如果您是来自网络浏览器的 运行 java 脚本,那么您仅限于 websockets,这意味着您要将 java 代码更改为 websocket 服务器。你可以在网上的某个地方找到一个图书馆。
我正在尝试使用 socket.io 连接 java 服务器和 Javascript 客户端。当我在浏览器上看到调试器时,看起来好像正在接收数据,但我收到此错误:"Reason: CORS header 'Access-Control-Allow-Origin' missing" 并且我无法在客户端打印数据。
import...
public class MeuServerSocket {
//initialize socket and input stream
private Socket socket = null;
private ServerSocket server = null;
private DataInputStream in = null;
public MeuServerSocket(int port) {
// starts server and waits for a connection
try {
while(true){
server = new ServerSocket(port);
System.out.println("Server started");
System.out.println("Waiting for a client ...");
socket = server.accept();
System.out.println("Client accepted");
ObjectOutputStream saida = new ObjectOutputStream(socket.getOutputStream());
saida.flush();
// send available data from server to client
saida.writeObject("Texto enviado 123...");
// takes input from the client socket
in = new DataInputStream(
new BufferedInputStream(socket.getInputStream()));
String line = "";
// reads message from client until "Over" is sent
boolean fim = false;
while (!line.equals("Over") && !fim)
{
try
{
line = in.readUTF();
System.out.println(line);
}
catch(IOException i)
{
fim = true;
System.out.println(i.toString());
}
}
System.out.println("Closing connection");
// close connection
socket.close();
saida.close();
in.close();
}
} catch (IOException i) {
System.out.println(i);
}catch(Exception e){
System.out.println(e.toString());
}
}
public static void main(String[] args) {
MeuServerSocket server = new MeuServerSocket(5000);
}
}
var socket = io('http://localhost:5000');
socket.on('connect', function () {
socket.send('hi \nOver');
socket.on('get', function (msg) {
// my msg
console.log('msg: '+msg)
})
socket.on('disconnect',()=>{
console.log('disconnected')
})
})
当我查看 Firefox 网络时,我看到数据是在其中一个包中发送的...
TLDR: 使用 ws://...
而不是 http://...
。
详情:
https
用于HTTP协议。在这种情况下,浏览器首先询问您的服务器是否允许 CORS 是正确的。您尚未启用 CORS。所以浏览器拒绝发送CORS请求是正常的。
但是你说你想使用 Web Sockets。那么你应该使用ws://
,而不是http://
。对于 Web 套接字,没有 CORS 策略,浏览器将在没有 CORS 限制的情况下发送您的请求。
我在这里看到的最大问题是对 socket.io 的误解。 java 脚本的 Socket.io 与 java 中的套接字库不兼容。命名约定肯定会令人困惑。
socket.io 是一个与 web sockets (ws://) 相关的库。它实现了所有基本的 websocket 功能以及一些额外功能。
您的 java 代码是一个 TCP 套接字服务器。虽然 websockets 和 socket.io 是建立在 TCP 套接字上的,但您不能将 socket.io 客户端连接到 "naked" 套接字服务器。
解决方案: 如果您的 java 脚本是来自 nodejs 的 运行,您可以使用他们找到的网络库 here。如果您是来自网络浏览器的 运行 java 脚本,那么您仅限于 websockets,这意味着您要将 java 代码更改为 websocket 服务器。你可以在网上的某个地方找到一个图书馆。