當前位置:首頁 » 雲伺服器 » 伺服器怎麼讀取多個客戶端

伺服器怎麼讀取多個客戶端

發布時間: 2022-08-07 07:24:55

1. Socket一個伺服器多個客戶端問題

非同步是事件式,好處是不需要多線程了。
在非同步事件中要處理每個的對話,為每一個對話建立一個數據區,分別處理,
不復雜,但要有點基本功。
我不是搞C#的,但思路一樣
是否可以解決您的問題?

2. 如何實現一個伺服器與多個客戶端連接

TCP協議:
伺服器端:tcp_server.c

[cpp] view plainprint?
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int server_sockfd;//伺服器端套接字
int client_sockfd;//客戶端套接字
int len;
struct sockaddr_in my_addr; //伺服器網路地址結構體
struct sockaddr_in remote_addr; //客戶端網路地址結構體
int sin_size;
char buf[BUFSIZ]; //數據傳送的緩沖區
memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零
my_addr.sin_family=AF_INET; //設置為IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連接到所有本地地址上
my_addr.sin_port=htons(8000); //伺服器埠號

/*創建伺服器端套接字--IPv4協議,面向連接通信,TCP協議*/
if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}

/*將套接字綁定到伺服器的網路地址上*/
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
perror("bind");
return 1;
}

/*監聽連接請求--監聽隊列長度為5*/
listen(server_sockfd,5);

sin_size=sizeof(struct sockaddr_in);

/*等待客戶端連接請求到達*/
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
perror("accept");
return 1;
}
printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr));
len=send(client_sockfd,"Welcome to my server/n",21,0);//發送歡迎信息

/*接收客戶端的數據並將其發送給客戶端--recv返回接收到的位元組數,send返回發送的位元組數*/
while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))
{
buf[len]='/0';
printf("%s/n",buf);
if(send(client_sockfd,buf,len,0)<0)
{
perror("write");
return 1;
}
}
close(client_sockfd);
close(server_sockfd);
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int server_sockfd;//伺服器端套接字
int client_sockfd;//客戶端套接字
int len;
struct sockaddr_in my_addr; //伺服器網路地址結構體
struct sockaddr_in remote_addr; //客戶端網路地址結構體
int sin_size;
char buf[BUFSIZ]; //數據傳送的緩沖區
memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零
my_addr.sin_family=AF_INET; //設置為IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連接到所有本地地址上
my_addr.sin_port=htons(8000); //伺服器埠號

/*創建伺服器端套接字--IPv4協議,面向連接通信,TCP協議*/
if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}

/*將套接字綁定到伺服器的網路地址上*/
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
perror("bind");
return 1;
}

/*監聽連接請求--監聽隊列長度為5*/
listen(server_sockfd,5);

sin_size=sizeof(struct sockaddr_in);

/*等待客戶端連接請求到達*/
if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
perror("accept");
return 1;
}
printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr));
len=send(client_sockfd,"Welcome to my server/n",21,0);//發送歡迎信息

/*接收客戶端的數據並將其發送給客戶端--recv返回接收到的位元組數,send返回發送的位元組數*/
while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))
{
buf[len]='/0';
printf("%s/n",buf);
if(send(client_sockfd,buf,len,0)<0)
{
perror("write");
return 1;
}
}
close(client_sockfd);
close(server_sockfd);
return 0;
}

TCP協議:

客戶端:tcp_client.c
[c-sharp] view plainprint?
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int client_sockfd;
int len;
struct sockaddr_in remote_addr; //伺服器端網路地址結構體
char buf[BUFSIZ]; //數據傳送的緩沖區
memset(&remote_addr,0,sizeof(remote_addr)); //數據初始化--清零
remote_addr.sin_family=AF_INET; //設置為IP通信
remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//伺服器IP地址
remote_addr.sin_port=htons(8000); //伺服器埠號

/*創建客戶端套接字--IPv4協議,面向連接通信,TCP協議*/
if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}

/*將套接字綁定到伺服器的網路地址上*/
if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
{
perror("connect");
return 1;
}
printf("connected to server/n");
len=recv(client_sockfd,buf,BUFSIZ,0);//接收伺服器端信息
buf[len]='/0';
printf("%s",buf); //列印伺服器端信息

/*循環的發送接收信息並列印接收信息--recv返回接收到的位元組數,send返回發送的位元組數*/
while(1)
{
printf("Enter string to send:");
scanf("%s",buf);
if(!strcmp(buf,"quit")
break;
len=send(client_sockfd,buf,strlen(buf),0);
len=recv(client_sockfd,buf,BUFSIZ,0);
buf[len]='/0';
printf("received:%s/n",buf);
}
close(client_sockfd);//關閉套接字
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int client_sockfd;
int len;
struct sockaddr_in remote_addr; //伺服器端網路地址結構體
char buf[BUFSIZ]; //數據傳送的緩沖區
memset(&remote_addr,0,sizeof(remote_addr)); //數據初始化--清零
remote_addr.sin_family=AF_INET; //設置為IP通信
remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//伺服器IP地址
remote_addr.sin_port=htons(8000); //伺服器埠號

/*創建客戶端套接字--IPv4協議,面向連接通信,TCP協議*/
if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}

/*將套接字綁定到伺服器的網路地址上*/
if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
{
perror("connect");
return 1;
}
printf("connected to server/n");
len=recv(client_sockfd,buf,BUFSIZ,0);//接收伺服器端信息
buf[len]='/0';
printf("%s",buf); //列印伺服器端信息

/*循環的發送接收信息並列印接收信息--recv返回接收到的位元組數,send返回發送的位元組數*/
while(1)
{
printf("Enter string to send:");
scanf("%s",buf);
if(!strcmp(buf,"quit")
break;
len=send(client_sockfd,buf,strlen(buf),0);
len=recv(client_sockfd,buf,BUFSIZ,0);
buf[len]='/0';
printf("received:%s/n",buf);
}
close(client_sockfd);//關閉套接字
return 0;
}

UDP協議:
伺服器端:udp_server.c

[cpp] view plainprint?
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int server_sockfd;
int len;
struct sockaddr_in my_addr; //伺服器網路地址結構體
struct sockaddr_in remote_addr; //客戶端網路地址結構體
int sin_size;
char buf[BUFSIZ]; //數據傳送的緩沖區
memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零
my_addr.sin_family=AF_INET; //設置為IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連接到所有本地地址上
my_addr.sin_port=htons(8000); //伺服器埠號

/*創建伺服器端套接字--IPv4協議,面向無連接通信,UDP協議*/
if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
{
perror("socket");
return 1;
}

/*將套接字綁定到伺服器的網路地址上*/
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
perror("bind");
return 1;
}
sin_size=sizeof(struct sockaddr_in);
printf("waiting for a packet.../n");

/*接收客戶端的數據並將其發送給客戶端--recvfrom是無連接的*/
if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
perror("recvfrom");
return 1;
}
printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr));
buf[len]='/0';
printf("contents: %s/n",buf);
close(server_sockfd);
return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main(int argc, char *argv[])
{
int server_sockfd;
int len;
struct sockaddr_in my_addr; //伺服器網路地址結構體
struct sockaddr_in remote_addr; //客戶端網路地址結構體
int sin_size;
char buf[BUFSIZ]; //數據傳送的緩沖區
memset(&my_addr,0,sizeof(my_addr)); //數據初始化--清零
my_addr.sin_family=AF_INET; //設置為IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;//伺服器IP地址--允許連接到所有本地地址上
my_addr.sin_port=htons(8000); //伺服器埠號

/*創建伺服器端套接字--IPv4協議,面向無連接通信,UDP協議*/
if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
{
perror("socket");
return 1;
}

/*將套接字綁定到伺服器的網路地址上*/
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
perror("bind");
return 1;
}
sin_size=sizeof(struct sockaddr_in);
printf("waiting for a packet.../n");

/*接收客戶端的數據並將其發送給客戶端--recvfrom是無連接的*/
if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
perror("recvfrom");
return 1;
}
printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr));
buf[len]='/0';
printf("contents: %s/n",buf);
close(server_sockfd);
return 0;
}

3. 易語言多個客戶端鏈接伺服器,同時操作讀寫,怎麼做到

伺服器用多線程。
客戶端隨意。
伺服器收到客戶端鏈接時開一個現成用來進行數據讀寫。單線程無法同時滿足兩個客戶端同時讀寫,因為一個客戶端申請了請求時,伺服器就會被佔用。

4. 伺服器如何訪問遠程路由下的多個指定的客戶端

伺服器在公網時,因為路由是單向的,不能定址路由器後面的設備。如果要做,有2個辦法:

  1. 在路由器中建立TCP埠靜態映射,比如把路由器外部埠1234,映射到路由器內部一台IP地址是192.168.1.88的5678,這樣公網中的設備通過TCP協議發送到路由器公網地址(比如39.xxx.xxx.xxx)埠1234的信息都會轉到192.168.1.88的5678埠,這樣就會被路由器下面的設備接收到

  2. 讓路由器後面的客戶端先給伺服器發送信息,然後伺服器對客戶端進行回答。客戶端的請求通過路由器時,會在路由器中建立動態映射,這樣伺服器的回答到達路由器時,會因為已經建立了動態映射,可以通過路由器而返回到客戶端

5. modbus tcp伺服器可以多個客戶端訪問相同的寄存器嗎

沒問題,肯定可以。modbus的讀指令都是可以連續讀多個數據的。
但你給出的地址似乎有問題,設備的地址一般不會用十六進制,應該是30002和30003地址,你再仔細看下設備手冊。
以下是從
30002地址讀取2個16位字的命令。
01
04
00
02
00
02
d0
0b
其中,
01是從機地址
04是讀取輸入寄存器指令,注意輸入寄存器從30001開始編址。
0002
是從第2個地址開始讀,即從30002開始讀。
0002
是讀取2個字,即30002和30003。
d00b
是校驗字。

6. c#如何實現多個客戶端的通信(同一個伺服器)

客戶端之間的通訊有兩個辦法。
1. 伺服器中轉
2. 伺服器上注冊後,客戶端之間直接通信。

對於第一種方法,大多比較簡單。查一下socket的文章,還有大把現成的代碼給你看。

第二個方法就稍微復雜一些。
但原理都一樣。客戶端A,鏈接伺服器後,地址信息就保存到了伺服器上。除了保持與伺服器的通信外。另外開啟一個 Socket,綁定到另一個埠,並且一直監聽此埠。
客戶端B連接伺服器,從伺服器上獲取客戶端A的地址信息。把客戶端A當成伺服器,連接A。

7. C語言中,客戶端如何對多個伺服器操作的,詳解~!!

connect有個參數是struct sockaddr 所以可以用多個socket連接多個服務端。然後通過不同的socket給不同的伺服器發送數據。還有你是不能直接操作伺服器的。伺服器只是根據你發送過去的特定數據進行響應。
一樣的,弄個線程然後循環一直accept,判斷:當有客戶端鏈接的時候,就保存下來鏈接的這個客戶端的socket,然後開個線程對這個socket發送數據就可以了。因為是循環accept就會有很多客戶端鏈接過來。

8. 服務端如何處理多客戶端請求

這些都不是問題的。正常的多客戶端要考慮使用的技術。
如果服務端使用IIS技術,則每個客戶端的請求和每個瀏覽器的請求沒有什麼區別,獲得請求,處理完數據直接響應就可以了。
如果使用的是程序,那麼多客戶端在線連接肯定要使用的是不同的埠,這與Socket編程相關,如果使用相同的埠,前一個Socket沒有釋放的情況下,後一個socket是無法執行的,雖然可以排隊或非同步,但都是一個道理。也就是宏觀的並發,其是非同步機制在啟作用。而如果使用不同的埠進行接收,那更簡單。但不管那種情況,每來一個socket處理一個socket就可以了。編程人員是不會涉及到其他底層信息的。

9. java 如何做一個伺服器對多個客戶端

一個伺服器對多個客戶端,你可以這樣去實現:在伺服器端程序中為每個連接上伺服器的客戶端開啟一個線程。這也就是多線程編程的內容了,至於你說怎麼阻止客戶端做重復的動作,你可以在客戶端運行某個動作時向伺服器端發送一個標識符,伺服器端用一個變數存儲這些標識符,但伺服器端在接受一個標識符後,會對存儲這些標識符的變數進行遍歷,如果這個標識符已經存在,那麼表明是一個重復的動作,伺服器端就可以禁止接受該重復動作

10. modbustcp伺服器查看有多少個客戶端

在Modbus-Tcp介面程序中的網路設置里可查看到客戶端。
首先客戶端要主動發起數據請求,客戶端發起的數據請求需要告訴伺服器它請求的數據有哪些。伺服器收到這個數據請求後,伺服器解析客戶端的請求並按照客戶端的請求返回數據。
客戶端收到數據響應後解析數據,這樣就完成了客戶端與伺服器之間的一次數據通訊。

熱點內容
編程畫櫻花 發布:2024-03-29 02:11:24 瀏覽:472
騰訊雲伺服器1mb老掉線 發布:2024-03-29 01:56:11 瀏覽:214
執行sql語句的存儲過程 發布:2024-03-29 01:52:37 瀏覽:696
婚紗攝影腳本 發布:2024-03-29 01:47:40 瀏覽:900
我的世界伺服器咋開外掛 發布:2024-03-29 01:07:45 瀏覽:455
sql寫報表 發布:2024-03-29 01:03:23 瀏覽:305
家用伺服器怎麼選 發布:2024-03-29 00:49:18 瀏覽:401
Ap6510dn如何配置 發布:2024-03-29 00:38:47 瀏覽:333
安卓和蘋果哪個更佔用內存 發布:2024-03-29 00:37:02 瀏覽:424
編譯錯誤算bug嗎 發布:2024-03-29 00:23:03 瀏覽:34