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地址并在客户端上打印出来的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的JAVA服务器-客户端模型-tcp

网络I/o编程模型12 netty实现tcp服务通讯(含EventLoop实现调度)

TCP阻塞模型下服务器和客户端的建立步骤

Java TCP 打孔

java实现TCP通信

Java 通过实现简单的TCP通信程序来理解TCP通信