如何在JAVA中运行服务器-客户机应用程序



我试图运行以下代码,首先运行chatserver文件,然后chatclient文件。

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

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

尝试不同的端口。

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

下面是您的工作示例:

//服务器

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

地址已被使用:JVM_Bind

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

Windows用户:

  1. 在命令提示符中发送命令"netstat -ao"。您可以获得所有进程的网络信息。
  2. 找到使用2000端口的设备,获取PID。
  3. 找出你刚从windows任务管理器中获得的PID进程并关闭它。(默认情况下,任务管理器不显示PID。你必须从菜单中添加它View | Select columns)
  4. 重启服务器。
  5. 重新启动刚刚关闭的应用程序
Unix用户:

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

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

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

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

您的端口2000已被其他进程使用。

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

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

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

最新更新