【发布时间】:2022-01-23 07:46:30
【问题描述】:
对于一个菜鸟问题,我很抱歉,但我正在学习 Java,并且正在玩一些我觉得有用且有趣的小项目,以提高我的学习水平。
我目前坚持的项目是我正在尝试用 Java 创建一个小型桌面应用程序,该应用程序将“监听”从另一个应用程序发送到 localhost 的文本。基本上,如果我输入 IP 和端口,我希望应用程序监听发送到该 IP 和端口的任何文本类型的流量。
我尝试使用我找到的一些代码并开始对其进行调整以满足我的需要。
package localHostApp;
import java.io.*;
import java.net.*;
public class Server2 {
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(1234);
Socket s=ss.accept();//establishes connection
DataInputStream dis=new DataInputStream(s.getInputStream());
String str=(String)dis.readUTF();
System.out.println("message= "+str);
ss.close();
}catch(Exception e){System.out.println(e);}
}
}
但是,如果您还有一个“客户端”应用程序也使用 Java 套接字进行连接,则此代码似乎才有效:
import java.io.*;
import java.net.*;
public class MyClient {
public static void main(String[] args) {
try{
Socket s=new Socket("localhost",1234);
DataOutputStream dout=new DataOutputStream(s.getOutputStream());
dout.writeUTF("Hello Server");
dout.flush();
dout.close();
s.close();
}catch(Exception e){System.out.println(e);}
}
}
当我运行服务器代码和客户端代码时,客户端将流量发送到控制台中显示的服务器就好了。但是,如果我尝试使用另一个应用程序(如 PUTTY)连接到服务器以将原始文本发送到服务器,它不会显示。它显示它已连接,但没有收到文本。
我在这里缺少什么? Java 中的套接字连接是否应该能够读取和显示发送到该 IP 和端口的任何信息?
再次,对于菜鸟问题感到抱歉。
--- 已更新 ---
所以我采用了这样的新方法:
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class Server {
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket();
Socket s=ss.accept();//establishes connection
var rawIn = ss.getInputStream();
var in = new BufferedReader(new InputStreamReader(rawIn, StandardCharsets.UTF_8)); {
while (true){
String cmd = in.readLine().trim();
if (cmd == null) break; //client is hung up
if (cmd.isEmpty()) continue; //empty line was sent
System.out.println("Client sent: " + cmd);
}
}
}catch(Exception e){System.out.println(e);}
}
}
在 var rawIn = ss.getInputStream 上,我收到错误消息“无法解析 'ServerSocket' 中的方法 'getInputStream'
我是否错误地采纳了以下建议?
----- 更新 2 ----
在我之前的合并方式中发现了一个错误。 (使用 ss.getInputStream 而不是 s.getInputStream)。
现在我可以编译和运行没有错误,但它立即说套接字尚未绑定并退出。我是否需要专门绑定 IP 和端口才能让它坐下来听?
---- 更新 3 -----
我想我已经危险地接近了。这是我目前的代码。
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class Server {
public static void main(String[] args){
try{
ServerSocket ss=new ServerSocket(1234, 1, 127.0.0.1);
Socket s=ss.accept();//establishes connection
var rawIn = s.getInputStream();
var in = new BufferedReader(new InputStreamReader(rawIn, StandardCharsets.UTF_8)); {
while (true){
String cmd = in.readLine().trim();
if (cmd == null) break; //client is hung up
if (cmd.isEmpty()) continue; //empty line was sent
System.out.println("Client sent: " + cmd);
}
}
}catch(Exception e){System.out.println(e);}
}
}
我的绑定地址出现错误,它正在寻找')' 或';'。我很困惑为什么会这样。
根据我从 Java API 中的理解,我的 ServerSocket 构造函数应该说监听端口 1234,一次允许一个套接字连接,并监听 127.0.0.1。
我错过了什么?
【问题讨论】:
-
如果您使用的是Putty,您需要将其设置为Telnet模式,或者直接使用Telnet客户端。 Putty 的默认模式是 SSH,除了发送原始击键之外,它还会执行许多其他握手操作。
-
对于
ServerSocket的第三个参数,第三个参数是InetAddress(或子类)类型的对象。 127.0.0.1 不是任何类型的对象,也根本不是标记,因此出现语法错误。 Java 有不带小数点的整数和带一个小数点的浮点数,但没有带三个小数点的数字。您想要稍微令人困惑的InetAddress.getByName("127.0.0.1"),因为原始的伯克利套接字 API(Java 基本上在其上建模)使用(在 C 中)gethostbyname()来处理 包含主机名 或 地址。 -
或者你可以使用方便的方法
InetAddress.getLoopbackAddress()——这是通常称为'localhost'的正式名称,而Java使用InetAddress.getLocalHost()来表示实际上不同的东西(主机声称网络可见地址)。