導航:首頁 > IDC知識 > 伺服器通信

伺服器通信

發布時間:2020-08-22 23:57:35

1、客戶端程序和伺服器之間通信用的是什麼技術?

客戶端程序和伺服器之間通信用這是網路傳輸層的問題,在傳輸層上主要就是兩種數據包,即為TCP(可靠連接)、UDP(不可靠連接),這個其實與你想要做的伺服器和程序設計沒有大的關系,不知道你要搭建什麼伺服器,是windows還是linux 伺服器,在windows下面一般是ASP.net +SQL server (很多人現在也在windows下做apacha+php+mysql); 在linux下面是apacha+php+mysql;網站使用的是HTTP協議來實現網站的建設

2、Android伺服器通信的幾種方式詳解

大 學學習網路基礎的時候老師講過,網路由下往上分為物理層、數據鏈路層、網路層、傳輸層、會話層、表示層和應用層。通過初步的了解,我知道IP協議對應於網 絡層,TCP協議對應於傳輸層,而HTTP協議對應於應用層,三者從本質上來說沒有可比性,socket則是對TCP/IP協議的封裝和應用(程序員層面 上)。也可以說,TPC/IP協議是傳輸層協議,主要解決數據如何在網路中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。關於TCP/IP和 HTTP協議的關系,網路有一段比較容易理解的介紹: 「我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如果沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使 用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。WEB使用HTTP協議作應用層協議,以封裝 HTTP文本信息,然後使用TCP/IP做傳輸層協議將它發到網路上。」
而我們平時說的最多的socket是什麼呢,實際上socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用介面(API), 通過Socket,我們才能使用TCP/IP協議。實際上,Socket跟TCP/IP協議沒有必然的聯系。Socket編程介面在設計的時候,就希望也 能適應其他的網路協議。所以說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道 的一些最基本的函數介面,比如create、listen、connect、accept、send、read和write等等。網路有一段關於 socket和TCP/IP協議關系的說法比較容易理解:「TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外 的操作介面。這個就像操作系統會提供標準的編程介面,比如win32編程介面一樣,TCP/IP也要提供可供程序員做網路開發所用的介面,這就是 Socket編程介面。」
關於TCP/IP協議的相關只是,用博大精深來講我想也不為過,單單查一下網上關於此類只是的資料和書籍文獻的數量就知道,這個我打算會買一些經典的書籍 (比如《TCP/IP詳解:卷一、卷二、卷三》)進行學習,今天就先總結一些基於基於TCP/IP協議的應用和編程介面的知識,也就是剛才說了很多的 HTTP和Socket。
CSDN上有個比較形象的描述:HTTP是轎車,提供了封裝或者顯示數據的具體形式;Socket是發動機,提供了網路通信的能力。
實際上,傳輸層的TCP是基於網路層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的介面。
下面是一些經常在筆試或者面試中碰到的重要的概念,特在此做摘抄和總結。
一。什麼是TCP連接的三次握手
第一次握手:客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包里不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉 連接之前,TCP 連接都將被一直保持下去。斷開連接時伺服器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過「四次握手」(過程就不細寫了,就是伺服器和客 戶端交互,最終確定斷開)
二。利用Socket建立網路連接的步驟
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
1。伺服器監聽:伺服器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
2。客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和埠號,然後就向伺服器端套接字提出連接請求。
3。 連接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶 端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。
三。HTTP鏈接的特點
HTTP協議即超文本傳送協議(Hypertext Transfer Protocol ),是Web聯網的基礎,也是手機聯網常用的協議之一,HTTP協議是建立在TCP協議之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回送響應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為「一次連接」。
四。TCP和UDP的區別(考得最多。。快被考爛了我覺得- -\\)
1。 TCP是面向鏈接的,雖然說網路的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證 了)保證了連接的可靠性;而UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接 收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。
2。也正由於1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。
知 道了TCP和UDP的區別,就不難理解為何採用TCP傳輸協議的MSN比採用UDP的QQ傳輸文件慢了,但並不能說QQ的通信是不安全的,因為程序員可以 手動對UDP的數據收發進行驗證,比如發送方對每個數據包進行編號然後由接收方進行驗證啊什麼的,即使是這樣,UDP因為在底層協議的封裝上沒有採用類似 TCP的「三次握手」而實現了TCP所無法達到的傳輸效率。

3、怎麼使用TCP/IP與伺服器進行通信

使用流進行網路通信
使用socket進行網路編程的最簡單方式是使用NSStream。
NSStream類對流操作進行了抽象,包括對各種流數據的讀和寫:內存流、網路流或文件流。當然,通過NSStream也可以與伺服器進行通信。
無論是通過NSStream向伺服器寫數據,還是從NStream對象中讀取伺服器數據,都是一件簡單的事情。
在Mac OS X中,使用NSHost和NSStream與伺服器進行連接的代碼如下:

NSInputStream *iStream;
NSOutputStream *oStream;
uint portNo = 500;
NSURL *website = [NSURLURLWithString:urlStr];
NSHost *host = [NSHost hostWithName:[websitehost]]; [NSStream getStreamsToHost:host
port:portNo
inputStream:&iStream
outputStream:&oStream];
NSStream的getStreamsToHost:port:inputStream:outputStream:方法用於連接伺服器並創建一對輸入輸出流用於向伺服器讀寫數據。問題是iOS中並沒有這個方法。因此上述代碼無法用於iPhoneapp中。

解決這個問題,需要為NSStream增加新的類別以增加
getStreamToHost:Port:inputstream:outputStream:方法。在Xcode中新建文件
NSStreamAdditions.m。然後在NSStreamAdditions.h中編寫代碼如下:

@interface NSStream (MyAdditions)
+ (void)getStreamsToHostNamed:(NSString*)hostName
port:(NSInteger)port
inputStream:(NSInputStream **)inputStreamPtr
outputStream:(NSOutputStream **)outputStreamPtr;
@end

在NSStreamAdditions.m文件中加入下列代碼。
#import "NSStreamAdditions.h"

@implementation NSStream (MyAdditions)

+ (void)getStreamsToHostNamed:(NSString*)hostName
port:(NSInteger)port
inputStream:(NSInputStream **)inputStreamPtr
outputStream:(NSOutputStream **)outputStreamPtr
{
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

assert(hostName != nil);
assert( (port > 0) && (port <65536) );
assert( (inputStreamPtr != NULL) ||(outputStreamPtr != NULL) );

readStream = NULL;
writeStream = NULL;

(
NULL,
(CFStringRef) hostName,
port,
((inputStreamPtr != nil) ?&readStream : NULL),
((outputStreamPtr != nil) ? &writeStream : NULL)
);

if (inputStreamPtr != NULL) {
*inputStreamPtr = [NSMakeCollectable(readStream)autorelease];
}
if (outputStreamPtr != NULL) {
*outputStreamPtr =[NSMakeCollectable(writeStream) autorelease];
}
}

@end

以上代碼為NSStream類增加了一個類方法叫做:
getStreamsToHostNamed:port:inputStream:outputStream:
現在你可以在iPhone app中,使用該方法了。

作者注:該類別代碼基於蘋果文檔 Apple』s Technical Q&A1652。
在NetworkViewController.m中,加入如下代碼:

#import "NetworkViewController.h"
#import "NSStreamAdditions.h"
@implementation NetworkViewController
NSMutableData *data;
NSInputStream *iStream;
NSOutputStream *oStream;
定義connectToServerUsingStream:portNo:方法如下。在方法中我們連接了伺服器並創建了一對輸入/輸出流:
-(void) connectToServerUsingStream:(NSString*)urlStr portNo: (uint) portNo {
if (![urlStrisEqualToString:@""]) {
NSURL *website =[NSURL URLWithString:urlStr];
if (!website) {
NSLog(@"%@ is not a valid URL");
return;
} else {
[NSStream getStreamsToHostNamed:urlStr
port:portNo
inputStream:&iStream
outputStream:&oStream];
[iStreamretain];
[oStream retain];
[iStreamsetDelegate:self];
[oStream setDelegate:self];
[iStream scheleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream scheleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStreamopen];
[iStream open];
}
}
}

方法中,我們將input和output放到了runloop中以便接收事件。這樣做,是為了防止流中沒有有效數據時代碼產生阻塞。input和
output的委託屬性都設置為self,因此我們還應該在NetworkViewController類中實現委託方法以便接收流數據。
使用 CFNetwork 進行網路通信
另一種TCP通信的方法是使用CFNetwork框架。CFNetwork屬於核心服務框架(C語言庫),提供了對HTTP、FTP、BSDsockets等網路協議的封裝。
為了演示如何使用CFNetwork框架,在NetworkViewController.m文件中加入如下語句:

#import "NetworkViewController.h"
#import "NSStreamAdditions.h"

@implementation NetworkViewController
NSMutableData *data;
NSInputStream *iStream;
NSOutputStream *oStream;
CFReadStreamRef readStream = NULL;
CFWriteStreamRef writeStream = NULL;
定義 connectToServerUsingCFStream:portNo: 方法如下:
-(void) connectToServerUsingCFStream:(NSString *)
urlStr portNo: (uint) portNo{
(kCFAllocatorDefault,
(CFStringRef) urlStr,
portNo,
&readStream,
&writeStream);
if (readStream &&writeStream){
CFReadStreamSetProperty(readStream,
,
kCFBooleanTrue);
CFWriteStreamSetProperty(writeStream,
,
kCFBooleanTrue);
iStream =(NSInputStream *)readStream;
[iStream retain];
[iStream setDelegate:self];
[iStreamscheleInRunLoop:[NSRunLoop currentRunLoop]
forMode:NSDefaultRunLoopMode];
[iStream open];
oStream = (NSOutputStream *)writeStream;
[oStreamretain];
[oStream setDelegate:self];
[oStream scheleInRunLoop:[NSRunLoopcurrentRunLoop]
forMode:NSDefaultRunLoopMode];
[oStream open];
}
}

先,我們使用()方法創建了一個到伺服器的TCP/IP連接,以及一對輸入輸出
流。然後將它們轉換為等價的O-C對象——NSInputStream和NSOutputStream。接下來跟前面一樣,設置delegate屬性並放
到runloop中運行。
發送數據
要想伺服器發送數據,請使用NSOutputStream對象:
-(void) writeToServer:(const uint8_t *) buf {
[oStream write:bufmaxLength:strlen((char*)buf)];
}
這段代碼發送了一個無符號整型數組到伺服器。
讀取數據
當伺服器有數據到達,stream:handleEvent:方法被觸發。因此我們只需在這個方法中讀取數據即可。
- (void)stream:(NSStream *)streamhandleEvent:(NSStreamEvent)eventCode {

switch(eventCode) {
case :
{
if (data == nil) {
data = [[NSMutableData alloc] init];
}
uint8_t buf[1024];
unsigned int len = 0;
len = [(NSInputStream *)stream read:buf maxLength:1024];
if(len) {
[data appendBytes:(const void *)buf length:len];
int bytesRead;
bytesRead += len;
} else {
NSLog(@"No data.");
}

NSString *str =[[NSString alloc] initWithData:data
encoding:NSUTF8StringEncoding];
NSLog(str);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Fromserver"
message:str
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];
[alert release];

[str release];
[data release];
data = nil;
} break;
}
}
該方法有兩個參數。一個NSStream對象和一個NSStreamEvent常量。NSStreamEvent常量可能包含以下取值:
NSStreamEventNone -- 沒有任何事件
NSStreamEventOpenCompleted -- 流打開成功.
-- 此時流中有位元組待讀取
-- 此時可向流中寫入數據
NSStreamEventErrorOccurred -- 有錯誤發生
NSStreamEventEndEncountered -- 到達流的末尾
對於輸入流,你應當檢測 常量。在這里,我們從輸入流中讀取了數據並顯示在UIAlertView中。

stream:handleEvent:方法中,很容易檢查到連接錯誤。在本例中,如果
connectToServerUsingStream:portNo:方法連接伺服器失敗,則在stream:handleEvent方法將被調用並在
NSStreamEvent參數中傳遞一個NSStreamEventErrorOccured錯誤。

4、正在與伺服器通信什麼意思

也就是說,正在連接中,等著吧,不然就是通訊失敗,或者你本地問題或者伺服器問題!

5、終端與伺服器通信問題

修改客戶端程序功能:程序啟動時,先讀取指定的ip列表文件內容。

伺服器更換新ip前,伺服器程序對客戶端程序發送預置指令:修改客戶端ip列表的新ip內容,下次客戶端程序重新啟動後,就會使用新ip聯機。如果來不及通知客戶端,那麼只要透過其他管道,將新ip列表文件傳送給客戶端做覆蓋更換文件即可。

 

也可以只更新客戶端程序的版本,新版本指向新ip的伺服器聯機。

6、什麼是客戶-伺服器通信方式?什麼是對等通信方式?兩者有什麼相同點與不同點?

客戶-伺服器方式是最常用的傳統方式,客戶是服務請求方,伺服器是服務提供方,可同時處理多個遠地或本地客戶的請求。
對等通信是兩台主機在通信時並不區分哪個是伺服器請求方還是服務提供方,只要兩台主機都運行了對等連接軟體,就可以平等的,對等連接通信。
相同的地方就是都能得到想要的服務,只不過前者可能速度較慢。

7、路由器與伺服器之間互相通信的協議

1.「ping」命令所產生的數據包,我們歸類為ICMP協議。說白了就是向目的地發送一個數據包,然後等待回應,如果回應正常則目的地的網路就是通的。當我們輸入了「ping」命令之後,我們的機器(電腦A)就生成了一個包含ICMP協議域的數據包,姑且稱之為「小德」吧~~~~
2.「小德」已經將ICMP協議打包到數據段里了,可是還不能發送,因為一個數據要想向外面傳送,還得經過「有關部門」的批准------IP協議。IP要將你的「寫信人地址」和「收信人地址」寫到數據段上面,即:將數據的源IP地址和目的IP地址分別打包在「小德」的頭部和尾部,這樣一來,大家才知道你的數據是要送到哪裡。
3.准備工作還沒有完。接下來還有部門要審核------ARP。ARP屬於數據鏈路層協議,主要負責把IP地址對應到硬體地址。直接說吧,都怪交換機太「傻」,不能根據IP地址直接找到相應的計算機,只能根據硬體地址來找。於是,交換機就經常保留一張IP地址與硬體地址的對應表以便其查找目的地。而ARP就是用來生成這張表的。比如:當「小德」被送到ARP手裡之後,ARP就要在表裡面查找,看看「小德」的IP地址與交換機的哪個埠對應,然後轉發過去。如果沒找到,則發一個廣播給所有其他的交換機埠,問這是誰的IP地址,如果有人回答,就轉發給它。
4.經過一番折騰,「小德」終於要走出這個倒霉的區域網了。可在此之前,它們還沒忘給「小德」屁股後面蓋個「戳」,說是什麼CRC校驗值,怕「小德」在旅行途中缺胳膊少腿,還得麻煩它們重新發送。。。。。我靠~~~~註:很多人弄不清FCS和CRC。所謂的CRC是一種校驗方法,用來確保數據在傳輸過程中不會丟包,損壞等等,FCS是數據包(准確的說是frame)里的一個區域,用來存放CRC的計算結果的。到了目的地之後,目的計算機要檢查FCS里的CRC值,如果與原來的相同,則說明數據在途中沒有損壞。
5.在走出去之前,那些傢伙最後折磨了一次「小德」------把小德身上眾多的0和1,弄成了什麼「高電壓」「低電壓」,在雙絞線上傳送了出去。暈~~出趟門就這么麻煩嗎?
6.坐著雙絞線旅遊,爽!可當看到很多人坐著同軸電纜,還有坐光纖的時候,小德又感覺不是那麼爽了。就在這時,來到了旅途的中轉站------路由器。這地方可是高級場所,人家直接查看IP地址!剩下的一概不管,交給下面的人去做。夠牛吧?路由器的內部也有一張表,叫做路由表,裡面標識著哪一個網路的IP對應著路由器的哪一個埠。這個表也不是天生就有的,而是靠路由器之間互相「學習」之後生成的,當然也可以由管理員手工設定。這個「學習」的過程是依靠路由協議來完成的,比如RIP,EIGRP,OSPF等等。
7.當路由器查看了「小德」的IP地址以後,根據路由表知道了小德要去的網路,接著就把小德轉到了相應的埠了。至此,路由器的主要工作完成,下面又是打包,封裝成frame,轉換成電壓信號等一系列「折騰」的活,就由數據鏈路層和物理層的模塊去干吧。
8.小德從路由器的出口出來,便來到了目的地----電腦B----所屬的網路的默認網關。默認網關可以是路由器的一個埠,也可以是區域網里的各種伺服器。不管怎樣,下面的過程還是一樣的:到交換機里的ARP表查詢「小德」的IP地址,看看屬於哪個區域網段或埠,然後就轉發到B了。
9.進了B的網卡之後,還要層層「剝皮」,基本上和從A出來的程序是一樣的------電腦B先校驗一下CRC值,看看數據是否完整;然後檢查一下frame的封裝,看到是IP協議之後,就把「小德」交給IP「部門」了;IP協議一看目的地址,正確,再看看應用協議,是ICMP。於是知道了該怎麼做了------產生一個回應數據包,(可以命名為「回應小德」),並准備以同樣的順序向遠端的A發送。。至於剛剛收到的那個數據包就丟棄了。
10.「回應小德」這個數據包又開始了上述同樣的循環,只不過這次發送者是B而接收者是A了。 以上是一個最簡單的路由過程,任何復雜的網路都是在次基礎之上實現的。

8、兩台伺服器之間怎麼通信

我說一種最簡單的方法:1、路由上映射80以及遠程埠給Web伺服器的80和遠程埠。2、路由上映射其他埠(如4489)給資料庫伺服器的遠程埠。這樣就解決了2台伺服器都需要遠程登陸的問題了。3、這2個機器,默認應該是走的內網路由方式連接,你就用內網IP把他們連接起來。

9、伺服器端和客戶端有什麼區別

伺服器端和客戶端的區別:

1、定義不同:

客戶端:客戶端(Client)或稱為用戶端,是指專與伺服器相對應,為客戶提供屬本地服務的程序。

伺服器端:伺服器端,從廣義上講,伺服器是指網路中能對其它機器提供某些服務的計算機系統(如果一個PC對伺服器端外提供ftp服務,也可以叫伺服器)。

2、程序編寫:

客戶端:客戶端程序不需要我們編寫,可以使用IE或者FireFox等瀏覽器。

伺服器端:需要編寫Server服務端程序。

3、組成不同:

客戶端:瀏覽器既是客戶端。

伺服器端:中央處理器、內存、晶元組、I/O匯流排、I/O設備、電源、機箱和相關軟體。

4、儲存方式不同:

客戶端:不需要儲存。

伺服器端:包括SAS/SATA、PCIe快閃記憶體卡、NVMe快閃記憶體和雙列直插式內存插槽的實現在內有多種方式部署伺服器端快閃記憶體。

5、服務對象不同:

客戶端:使用客戶服務。

伺服器端:為客戶端服務。

10、什麼是客戶端/伺服器通信模式

客戶端/伺服器模式又叫C/S模式,是一種軟體系統結構的一種,是基於企業內部網路的應用系統,能夠充分發揮客戶端的處理能力,對應的優點是客戶端響應快,安全性高

與伺服器通信相關的知識