Java实现客户端服务器模型(使用TCP)并从服务器发送IP地址并在客户端上打印出来
Posted
技术标签:
【中文标题】Java实现客户端服务器模型(使用TCP)并从服务器发送IP地址并在客户端上打印出来【英文标题】:Java Implementing a Client Server Model (Using TCP) and sending a IP address from server and Printing it out on Client 【发布时间】:2022-01-02 23:59:47 【问题描述】:服务器代码:
package exp1;
import java.net.*;
import java.io.*;
public class MyServerSocket
public static void main(String[] args) throws IOException
// TODO Auto-generated method stub
ServerSocket ss=new ServerSocket(2050);
System.out.println("server is waiting...");
Socket s=ss.accept();
InetAddress ad= InetAddress.getByName("hostname");
OutputStream os=s.getOutputStream();
System.out.println("s"+ ad.getHostAddress());
byte ins=Byte.parseByte(ad.getHostAddress());
os.write(ins);
ss.close();
客户端代码:
package exp1;
import java.io.*;
import java.net.*;
public class MyClientSocket
public static void main(String[] args) throws Exception
Socket s=new Socket(InetAddress.getLocalHost(),2050);
InputStream is=s.getInputStream();
System.out.println("Client is ready to receive data");
int d=0;
while(d!='#')
d=is.read();
System.out.print((char)d);
错误:
服务器端:
线程“main”java.lang.NumberFormatException 中的异常:对于输入 字符串:“ip”
在 java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:67)
在 java.base/java.lang.Integer.parseInt(Integer.java:660)
在 java.base/java.lang.Byte.parseByte(Byte.java:193)
在 java.base/java.lang.Byte.parseByte(Byte.java:219)
在 exp1/exp1.MyServerSocket.main([MyServerSocket.java:14](https://MyServerSocket.java:1
我正在尝试在客户端上显示本地主机的 ip,但出现错误。
【问题讨论】:
【参考方案1】:getHostAddress
返回地址的字符串表示形式。因此,此方法返回类似 192.168.1.100
的内容,无法解析为字节。您可以将字符串作为字节数组传递,但这不是最佳解决方案,因为 IPv4 地址只有 4 个字节,而字符串 192.168.1.100
的长度为 13 个字节!
另外,我不明白while (d != '#')
行的用途,因为您从未发送任何#
符号。
这是适合我的代码
class MyServerSocket
public static void main(String[] args) throws IOException
ServerSocket ss = new ServerSocket(2050);
System.out.println("server is waiting...");
Socket s = ss.accept();
InetAddress ad= InetAddress.getByName("hostname");
try (OutputStream os = s.getOutputStream())
System.out.println("s"+ ad.getHostAddress());
os.write(ad.getAddress());
ss.close();
class MyClientSocket
public static void main(String[] args) throws Exception
Socket s=new Socket(InetAddress.getLocalHost(),2050);
try (InputStream is = s.getInputStream())
System.out.println("Client is ready to receive data");
byte[] address = is.readAllBytes();
InetAddress ad = InetAddress.getByAddress(address);
System.out.println(ad.getHostAddress());
附:关闭您打开的所有资源是避免泄漏的好习惯。在示例中,我使用了try-with-resources 构造。
【讨论】:
有没有办法在客户端不使用 InetAddress?我们在服务器上完成这些部分并将其发送给客户端,客户端仅将其打印出来。顺便感谢您的帮助:) 你可以在服务器端做os.write(ad.getHostAddress().getBytes(StandardCharsets.UTF_8))
,在客户端做String ad = new String(address, StandardCharsets.UTF_8)
谢谢!工作甜蜜:)以上是关于Java实现客户端服务器模型(使用TCP)并从服务器发送IP地址并在客户端上打印出来的主要内容,如果未能解决你的问题,请参考以下文章