linux網路程式設計,將伺服器端時間通過tcp傳送到客戶端
阿新 • • 發佈:2019-02-18
用C語言編寫一個server.c的伺服器端程式,用於接收客戶端的連線,連線成功後,每2秒鐘通過建立的連線向客戶端傳送當前的時間
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/socket.h> #include <time.h> #define SERV_PORT 8888 #define BACKLOG 20 #define BUF_SIZE 256 int main(int argc, char *argv[]) { int ret; time_t tt; struct tm *ttm; char buf[BUF_SIZE]; pid_t pid; int sockfd; int clientfd; struct sockaddr_in host_addr; struct sockaddr_in client_addr; int length = sizeof client_addr; sockfd = socket(AF_INET,SOCK_STREAM, 0); if(sockfd == -1) { printf("create socket failed.\n"); return 0; } bzero(&host_addr, sizeof(host_addr)); host_addr.sin_family=AF_INET; host_addr.sin_port=htons(SERV_PORT); host_addr.sin_addr.s_addr= INADDR_ANY; ret = bind(sockfd, (struct sockaddr *)&host_addr, sizeof host_addr); if(ret == -1) { printf("bind failed.\n"); return 1; }else { printf("bind success.\n"); } ret = listen(sockfd, BACKLOG); if(ret == -1) { printf("listen failed.\n"); return 1; }else { printf("listen success.\n"); } while(1) { clientfd = accept(sockfd, (struct sockaddr *)&client_addr, &length); if(clientfd == -1) { printf("accept faild.\n"); return 1; }else { printf("accept success.clientfd is %d.\n", clientfd); } pid = fork(); if(pid == 0) { while(1) { bzero(buf, sizeof buf); tt = time(NULL); ttm = localtime(&tt); strcpy(buf, asctime(ttm)); printf("begin send to client\n"); send(clientfd, buf, strlen(buf), 0); sleep(2); } close(clientfd); }else if(pid > 0) { close(clientfd); } } return 0; }
客戶端用Java來實現
package com.study; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("10.180.0.181", 8888); StringBuffer sb = new StringBuffer(); BufferedReader is = new BufferedReader(new InputStreamReader( socket.getInputStream())); char[] b = new char[1024]; int len; while ((len = is.read(b)) > 0) { sb.append(b); System.out.println(new String(b, 0, len)); } } }
<pre name="code" class="html"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">客戶端用C語言實現</span>
編譯gcc client.c -o client#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <sys/socket.h> #include <time.h> #define SERV_PORT 8888 #define BACKLOG 20 #define BUF_SIZE 256 int main(int argc, char *argv[]) { int ret; char buf[BUF_SIZE]; int sockfd; //定義socket描述符 struct sockaddr_in serv_addr; //伺服器IP地址和埠資訊 if(argc != 2) { printf("命令列輸入有誤.\n"); return 1; } //建立套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); //TCP/IP協議,資料流套接字 if(sockfd == -1) { printf("呼叫socket函式失敗.\n"); return 2; } //建立連線 bzero(&serv_addr, sizeof serv_addr); serv_addr.sin_family = AF_INET; //TCP/IP協議 serv_addr.sin_port = htons(SERV_PORT); //設定埠 serv_addr.sin_addr.s_addr = INADDR_ANY; //使用迴環地址127.0.0.1 inet_aton(argv[1], (struct sockaddr *)&serv_addr.sin_addr.s_addr); ret = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof serv_addr); //繫結套接字 if(ret == -1) { printf("呼叫connect函式失敗.\n"); return 3; }else { printf("connect success.\n"); } while(1) { bzero(buf, sizeof buf); recv(sockfd, buf, sizeof(buf), 0); printf("接收到:%s", buf); sleep(1); } return 0; }
執行./client 10.180.0.181
客戶端結果為: