【问题标题】:How to run a server-client application in JAVA [duplicate]如何在 JAVA 中运行服务器-客户端应用程序 [重复]
【发布时间】:2015-09-09 06:41:14
【问题描述】:

我正在尝试通过先运行聊天服务器文件然后运行聊天客户端文件来运行以下代码。

import java.net.*;
import java.io.*;

public class  chatserver
{
    public static void main(String args[]) throws Exception
    {
        ServerSocket ss=new ServerSocket(2000);
        Socket sk=ss.accept();
        BufferedReader cin=newBufferedReader(newInputStreamReader(sk.getInputStream()));
        PrintStream cout=new PrintStream(sk.getOutputStream());
        BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
        String s;
        while (  true )
        {
            s=cin.readLine();
            if (s.equalsIgnoreCase("END"))
            {
                cout.println("BYE");
                    break;
              }
            System. out.print("Client : "+s+"\n");
            System.out.print("Server : ");
            s=stdin.readLine();
            cout.println(s);
        }
        ss.close();
        sk.close();
        cin.close();
        cout.close();
        stdin.close();
    }
}

public class  chatclient
{
    public static void main(String args[]) throws Exception
    {
        Socket sk=new Socket("192.168.0.19",2000);
        BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
        PrintStream sout=new PrintStream(sk.getOutputStream());
        BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
        String s;
        while (  true )
        {
            System.out.print("Client : ");
            s=stdin.readLine();
            sout.println(s);
            s=sin.readLine();
            System.out.print("Server : "+s+"\n");
            if ( s.equalsIgnoreCase("BYE") )
               break;
        }
         sk.close();
         sin.close();
         sout.close();
        stdin.close();
    }
}

但它不起作用。运行此类应用程序的正确程序/步骤是什么?

运行服务器文件会出现以下错误。

Exception in thread "main" java.net.BindException: Address already in use: JVM_Bind
    at java.net.DualStackPlainSocketImpl.bind0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
    at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:382)
    at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
    at java.net.ServerSocket.bind(ServerSocket.java:375)
    at java.net.ServerSocket.<init>(ServerSocket.java:237)
    at java.net.ServerSocket.<init>(ServerSocket.java:128)
    at javaapplication1.chatserver.main(chatserver.java:19)
Java Result: 1

【问题讨论】:

  • 地址已在使用意味着某些程序已经在监听端口 2000(很可能是您没有正确关闭的同一个程序)。

标签: java server client


【解决方案1】:

Address already in use 表示某些程序已经在侦听端口 2000(很可能是您未正确关闭的同一程序)。

尝试不同的端口。

您可以在命令行上使用netstat 命令查看当前正在使用的端口。

【讨论】:

    【解决方案2】:

    这是您的工作示例:

    // 服务器

    package test;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
    
    public Server() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String args[]) throws Exception
    {
        System.out.println("Server started");
        ServerSocket ss=new ServerSocket(8888);
        System.out.println("Server waiting for connection");
        Socket sk=ss.accept();
        System.out.println("Server Connected");
        BufferedReader cin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
        PrintStream cout=new PrintStream(sk.getOutputStream());
        BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
        String s;
        while (  true )
        {
            s=cin.readLine();
            if (s.equalsIgnoreCase("END"))
            {
                cout.println("BYE");
                    break;
              }
            System. out.print("Client : "+s+"\n");
            System.out.print("Server : ");
            s=stdin.readLine();
            cout.println(s);
        }
        ss.close();
        sk.close();
        cin.close();
        cout.close();
        stdin.close();
    }
    
    }
    

    // 客户端

    package test;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.io.PrintStream;
    import java.net.Socket;
    
    public class Client {
    
    public Client() {
        // TODO Auto-generated constructor stub
    }
    public static void main(String args[]) throws Exception
    {
        System.out.println("Client started");
        Socket sk=new Socket("localhost",8888);
        System.out.println("Client Connected");
        BufferedReader sin=new BufferedReader(new InputStreamReader(sk.getInputStream()));
        PrintStream sout=new PrintStream(sk.getOutputStream());
        BufferedReader stdin=new BufferedReader(new InputStreamReader(System.in));
        String s;
        while (  true )
        {
            System.out.print("Client : ");
            s=stdin.readLine();
            sout.println(s);
            s=sin.readLine();
            System.out.print("Server : "+s+"\n");
            if ( s.equalsIgnoreCase("BYE") )
               break;
        }
         sk.close();
         sin.close();
         sout.close();
        stdin.close();
    }
    }
    

    【讨论】:

      【解决方案3】:

      地址已被使用:JVM_Bind

      Java 应用程序正在尝试连接端口 2000,但该端口已被其他进程使用,JVM 绑定到该特定端口 2000 失败。现在要修复此错误,您需要找出哪个进程正在侦听端口 2000

      Windows 用户:

      1. 在命令提示符中,发送命令“netstat -ao”。您可以获得所有进程的网络信息。
      2. 找出使用端口 2000 的那个,获取 PID。
      3. 找出您刚刚从 Windows 任务管理器获得的 PID 进程并将其关闭。 (默认情况下,任务管理器不显示 PID。您必须从菜单中添加它查看 | 选择列)
      4. 重新启动服务器。
      5. 重新启动刚刚关闭的应用程序。

      Unix 用户:

      大多数 Unix 系统都有内置的 fuser 命令,该命令返回正在使用端口的进程:

      fuser -v -n (tcp | udp) <port#>
      

      但是如果你不能杀死那个进程,那么你需要改变你的 web 服务器配置或 eclipse 配置来监听不同的端口。如果是 tomcat,您可以在 server.xml 的连接器部分更改它,如果是 eclipse,您可以在此处查看设置 Eclipse 以进行 Java 远程调试。

      【讨论】:

      • MS-DOS 是一个操作系统。 Windows 命令提示符是一个类似于 MS-DOS 的界面。
      【解决方案4】:

      更改您用于运行应用程序的端口号。 有关更多信息,请查看此链接-http://www.mastertheboss.com/jboss-server/jboss-configuration/solving-javanetbindexception-address-already-in-use-jvmbind

      【讨论】:

        【解决方案5】:

        您的端口 2000 已被另一个进程使用。

        尝试在命令行上使用 netstat 命令查看正在使用的端口。

        我通常使用 5 位端口,例如 10999,这并不常见。

        【讨论】:

          【解决方案6】:

          您为客户端和服务器使用相同的端口:2000,这就是启动客户端失败的原因,因为只有一个进程可以使用套接字,所以如果服务器使用它,那么客户端不能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多