2015-09-09 95 views
-1

我試圖運行以下代碼,首先運行chatserver文件,然後運行chatclient文件。如何在JAVA中運行服務器客戶端應用程序

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 
+1

地址已經在使用意味着某些程序已經在端口2000上監聽(最有可能是您沒有正確關閉的相同程序)。 – Kayaman

回答

1

Address already in use指一些程序上的2000端口已在偵聽(最有可能在同一個程序你沒有正常關機)。

嘗試一個不同的端口。

您可以在命令行上使用netstat命令查看當前正在使用哪些端口。

1

地址已在使用: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 -v -n (tcp | udp) <port#> 

,但如果你不能殺死該進程比您需要更改Web服務器配置或eclipse配置以偵聽不同的端口。在tomcat的情況下,您可以在server.xml的連接器部分更改它,並且在eclipse的情況下,您可以在這裏看到設置Eclipse for Java遠程調試。

+1

MS-DOS是一個操作系統。 Windows命令提示符是一個看起來像MS-DOS的界面。 – MihaiC

0

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

嘗試在命令行上使用netstat命令查看哪個端口正在使用中。

我通常使用5999像10999這是不常見的端口。

0

您對客戶端和服務器使用相同的端口:2000,這就是爲什麼啓動客戶端失敗,因爲只有一個進程可以使用套接字,所以如果服務器接受它,則客戶端不能。

1

這是你的工作示例:

//服務器

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(); 
} 
} 
相關問題