2016-02-19 65 views
0

我已經通過了我在Java書中找到的這個程序。但我有一個非常基本的問題,我無法在互聯網上找到任何具體的答案。服務器端程序連接詳細信息

我的代碼:

我減少了所有與我的問題有關的代碼。

import java.io.*;  
import java.net.*;  
public class DailyS {  
String s="someString"; 
public void go{  
try{  
ServerSocket S=new ServerSocket(4242);  while(true) 
    {   
Socket sock=S.accept();   
//other codes, irrelevant here 
    } 
}  
catch(IOException ex) {  
ex.printStackTrace(); 
}  
} public static void main(String[] arg){ 
DailyS server = new DailyS(); 

server.go() ; 
} 
    } 

我知道,ServerSocket會收到一個客戶端,並指定他的其他一些隨機端口。

我的疑問:

當將這個程序開始運行,並在代碼什麼時候將它開始運行? 我知道java程序開始從main()方法運行。但事情是客戶端程序沒有創建DailS對象的代碼片段。它只是連接到Server。客戶端程序不調用服務器端程序中的go()。那麼如果go()沒有運行,連接將如何完成。這是由java內部管理的嗎?

此連接請求是否會在DS中運行main()方法?

客戶端程序:

import java.io.*; 
    import java.net.*; 
    public class DailyCS 
    { 
    public void go{ 
    try{ 
    Socket s=new Socket("ip","port"); 
} 
catch(IOException ex) { 
    ex.printStackTrace(); 
    } 
    } 
    public static void main(String[] args) { 
    DailyCS server = new DailyCS(); 
    server.go() ; 
    } 
    } 

客戶端程序開始從主運行方法,創建一個對象server,並調用go()go()有請求連接的代碼。但在任何時候,它都會創建一個服務器端類對象。它既不在服務器端類中調用go()。那麼連接將如何完成?

main()在服務器端程序中的用途是什麼?

+0

客戶端從未連接到服務器......它只是產生一個套接字對象。主要方法的要點是運行該程序。這很簡單 –

+0

你必須運行這兩個程序。在服務器端,程序將偵聽指定端口上的連接,並在客戶端,程序將與服務器上的端口建立連接。一旦連接完成,客戶端和服務器就能夠相互發送數據。客戶端和服務器端程序不會直接調用對方的方法 –

+0

@Jitin Kodian這意味着服務器端程序應該全天候運行。對? –

回答

2

網絡101.

服務器有一個開放的端口「偵聽」通過ServerSocket。這偵聽傳入的連接。

客戶端也有一個套接字,但它是一個傳出連接到服務器的套接字。服務器必須正在運行並且正在監聽以進行連接以便客戶端進行通信。

該服務器程序與客戶端完全分離。除非明確通過套接字連接,否則它們不共享變量。僅僅因爲有類似的命名方法和類,不會使它們相同。

由於這是Java,所以這兩個程序都需要實際運行的主要方法。兩種go方法都在相應的類中運行,但只有服務器套接字實際上正在接受連接。客戶端代碼生成套接字對象並連接到服務器(假定服務器代碼在客戶端代碼之前運行)。

+0

我還有一個疑問。服務器中的程序如何運行? –

+0

它將如何不停頓地運行? –

+0

方法'ServerSocket.accept'暫停執行程序並等待連接。這應該在自己的線程上完成,以免阻止其他代碼運行。建立連接後,通常會添加一個while循環以不斷偵聽來自客戶端的傳入消息。 –

相關問題