当前位置: 首页 > 知识库问答 >
问题:

Java实现客户端服务器模型(使用TCP),从服务器发送IP地址并在客户端打印出来

史懿轩
2023-03-14

服务器代码:

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); 
    }        
    }
}

错误:

服务器端:

线程“主”中的异常 java.lang.数字格式异常:对于输入字符串:“ip”

at Java . base/Java . lang . numberformatexception . for inputstring(numberformatexception . Java:67)

位于Java . base/Java . lang . integer . parse int(integer . Java:660)

位于java.base/java.lang.Byte.parseByte(Byte.java:193)

位于Java . base/Java . lang . byte . parsebyte(byte . Java:219)

at exp1/exp1.MyServerSocket.main([MyServerSocket.java:14](https://MyServerSocket.java: 1

我正在尝试在客户端上显示本地主机的IP,但收到错误。

共有1个答案

王宏扬
2023-03-14

getHostAddress返回地址的字符串表示形式。因此,此方法返回无法解析为字节的192.168.1.100。您可以将字符串作为字节数组传递,但这不是最佳解决方案,因为IPv4地址只有4个字节,但string192.168.1.100长13个字节!

此外,我不明白行< code>while (d!= '#')因为您从不发送任何< code>#符号。

这是适合我的代码。

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());
    }
  }
}

附言:关闭您打开的所有资源是避免泄漏的好做法。在此示例中,我使用了使用资源进行尝试的构造。

 类似资料:
  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我正在使用TCP / IP流编写客户端服务器Java程序,我的服务器连接到oracle数据库。当客户端请求一些信息时,服务器处理查询,即返回一个包含一些行的列(例如 5)。我想将整列发送回客户端,我能够发送和接收单行数据,但不能发送和接收多行(因为表包含许多行 i,e 行)....任何帮助都是可取的

  • 我正在创建我的产品,并与这个问题。有一天,我设置了Socket.io,一切都很好。第二天,我将服务器和客户端从http迁移到HTTPS。迁移后客户端和服务器端仍然连接,但不能从客户端发射到服务器,从服务器发射到客户端。 我的ssl证书位于和中,它们加载正确。运行在上的服务器 我的示例react组件。我的react应用程序运行在上。HTTPS连接良好,工作良好。 我该怎么办?也许我在中错误地使用了s

  • 我试图将一个对象从服务器端发送到客户端,但找不到问题。以下是我在客户端遇到的错误: 下面是服务器端方法:无限循环中的separate方法只是从文件中读取,并将用户名和密码解析为ArrayList,这是服务器类中的实例变量。 以下是从服务器请求信息的客户端: 我对学习服务器套接字和套接字还不熟悉,但我在这里试图实现的是以下目标。当我在另一节课上按下按钮时,我会这样做: 几乎是一个通过服务器到clei

  • 创建 TCP 客户端 最简单的方法来创建一个 TCP 客户端,使用默认选项如下所示: NetClient client = vertx.createNetClient(); 配置 TCP 客户端 如果你不想使用默认值,则创建TCP 客户端时,通过传入NetClientOptions实例可以配置: NetClientOptions options = new NetClientOptions().s