2012-03-06 103 views
1

我想知道是否有兩個程序,一個名爲server,另一個名爲client,這兩個分別說明服務器和客戶端,是否可以在一臺機器上測試它們?考慮到我所定義的客戶端套接字如下:在單個系統上運行客戶端/服務器端編程

socket = new Socket("127.0.0.1",3000); 

編輯: 服務器部分:

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

class TCPServer 
{ 
     private static ServerSocket serverSocket; 
     private static Socket socket; 
     private static PrintWriter toClient; 
     private static BufferedReader fromClient; 
     public static void run() throws IOException 
      { 
      System.out.println("Server is waiting for connections..."); 
      while (true) 
      { 
       openStreams(); 
       processClient(); 
       closeStreams(); 
      } 

     } 

     public static void openStreams() throws IOException 
      { 
      serverSocket = new ServerSocket(3000); 
      socket = serverSocket.accept(); 
      toClient = new PrintWriter(socket.getOutputStream(),true); 
      fromClient = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } 
     public static void closeStreams() throws IOException 
      { 
      fromClient.close(); 
      toClient.close(); 
      socket.close(); 
      serverSocket.close(); 
     } 
     public static void processClient()throws IOException 
{ 
    String msg = null; 
    do { 
     msg = fromClient.readLine(); 
     toClient.println("Client said " + msg); 
    } while (!"exit".equals(msg)); 
} 

     } 

客戶端部分:

package clientserver.pkg1; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.Socket; 
import java.util.Scanner; 

class TCPClient 
{ 
     private PrintWriter toServer; 
      private BufferedReader fromServer; 
      private Socket socket; 
      public void Client()throws IOException 
       { 
       socket = new Socket("127.0.0.1",3000); 
      } 
      public void openStreams() throws IOException 
     { 

       toServer = new PrintWriter(socket.getOutputStream(),true); 
       fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      } 
      public void closeStreams() throws IOException 
       { 
       fromServer.close(); 
       toServer.close(); 
       socket.close(); 
      } 
      public void run()throws IOException 
{ 
    openStreams(); 
    String msg = ""; 
    Scanner scanner = new Scanner(System.in); 
    while (!"exit".equals(msg)) 
    { 
     System.out.print(">"); 
     msg = scanner.nextLine(); 
     toServer.println(msg); 
     String tmp = fromServer.readLine(); 
     System.out.println("Server said: " + tmp); 
    } 
    closeStreams(); 
} 

      } 

主類

public static void main(String[] args) { 

     try 
      { 
       TCPServer server = new TCPServer() {}; 
       TCPClient client = new TCPClient(); 
       client.run(); 
       server.run(); 




      } 
      catch(IOException e) 
      { 
       System.err.println("Error in Client " + e.getMessage()); 
      } 




java.lang.NullPointerException 
toServer = new PrintWriter(socket.getOutputStream(),true); 
 public void run()throws IOException 
{ 
    openStreams(); 
..... 
} 
public static void main(String[] args) { 

     try 
      { 
       TCPClient client = new TCPClient(); 
       client.run(); 
      } 

client.run();

回答

0

你當然可以,只要客戶端和服務器連接到相同的端口號。

+0

所以爲此,我應該運行客戶端和服務器在兩個不同的程序或相同?因爲當我這樣做後,運行服務器一切正常,但當我運行客戶端,它給了我3空指針異常,我把它們作爲編輯在我的職位 – lonesome 2012-03-06 09:15:02

0

肯定的是,你可以在同一臺機器上測試它們,。 年前,我使用套接字做了類似聊天的應用程序,並且在我使用一些不同的機器進行測試之前,我測試了它到同一臺機器上,而且這樣做很好。

0

您可以在PC的端口上的讀/寫,獨立的,從去哪兒網在你

1

是的,你可以寫這樣的程序。有一個useful tutorial for this。 總之,這一切都歸結爲準備一個ServerSocket:

ServerSocket createSocket() { 
    ServerSocket serverSocket; 
    try { 
     serverSocket = new ServerSocket(3000); 
    } catch (IOException ex) { 
     ex.printStackTrace(System.err); 
     throw ex; 
    } 
    return serverSocket; 
} 

但從程序員的角度來看,有居住在遠程計算機上或在本地一個服務器之間沒有區別。

您可以嘗試編寫兩個不同的程序,一個用於服務器,另一個用於客戶端。 這是主要的客戶端:

public static void main(String[] args) { 
    try { 
     TCPClient client = new TCPClient() {}; 
     client.run(); 
    } catch(IOException e) { 
    System.err.println("Error in Client " + e.getMessage()); 
    } 

而這個服務器:

public static void main(String[] args) { 
    try { 
     TCPServer server = new TCPServer() {}; 
     server.run(); 
    } catch(IOException e) { 
    System.err.println("Error in Server " + e.getMessage()); 
    } 

然後在不同的控制檯,然後再在客戶端上運行的服務器。

+0

因此,我應該運行客戶端和服務器在兩個不同的程序或相同?因爲當我這樣做後,運行服務器一切正常,但是當我運行客戶端,它給了我3空指針異常,我把它們作爲編輯在我的崗位 – lonesome 2012-03-06 09:18:52

+0

你可以發佈完整的堆棧跟蹤和代碼失敗? NullPointerException出現在哪裏? 因此,套接字仍爲「空」,並且不會引發異常? – f00l 2012-03-06 09:23:20

+0

我展示了異常發生的3個景點,但我會在這裏發佈整個代碼 – lonesome 2012-03-06 09:27:38

相關問題