程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> mysql-如何利用C#和socket做出一個聊天室

mysql-如何利用C#和socket做出一個聊天室

編輯:編程綜合問答
如何利用C#和socket做出一個聊天室

1.進一步熟悉和掌握TCP/IP協議的原理。
2.初步了解網絡環境下的程序設計步驟與過程。
3.初步掌握Winsock提供的函數的功能與使用方法。
4.理解網絡的Socket通信。
5.利用Winsock編寫基於TCP或UDP協議的C/S模式網絡通信軟件——一個類似QQ的網絡聊天工具。

這是我們期末大作業的要求,需要用到的只是大概有C# ,socker , MYSQL ,不知道有什麼辦法做成這個,或者有大神可以推薦下C#和MYSQL的自學視頻之類的麼,
所涉及的深度只要能完成大實驗就行,謝謝了~

最佳回答:


至於c#微軟的產品,我很不喜歡,所以在c#方面我給不了你的具體的代碼!
在linux ubuntu 請使用gcc編譯器。
我可以給你看看c代碼實現的通信模型:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char **argv)
{
    int listenfd, connfd;
    struct sockaddr_in servaddr;
    char buff[4096];
    int n;

    if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        printf("create socket error: %s(errno: %d)\n",
               strerror(errno), errno);
        exit(0);
    }

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(8888);

    if (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))
        == -1) {
        printf("bind socket error: %s(errno: %d)\n",
               strerror(errno), errno);
        exit(0);
    }

    if (listen(listenfd, 10) == -1) {
        printf("listen socket error: %s(errno: %d)\n",
               strerror(errno), errno);
        exit(0);
    }

    printf("======waiting for client's request======\n");
    while (1) {
        if ((connfd =
             accept(listenfd, (struct sockaddr *) NULL,
                NULL)) == -1) {
            printf("accept socket error: %s(errno: %d)",
                   strerror(errno), errno);
            continue;
        }
        while(n = recv(connfd, buff, MAXLINE, 0)){
        buff[n] = '\0';
        printf("recv msg from client: %s\n", buff);
            if(!strcmp(buff,"quit")){
            close(connfd);
            break;
            }
        }
    }

    close(listenfd);
}

客戶端:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define MAXLINE 4096
int main(int argc, char **argv)
{
    int sockfd, n;
    char recvline[4096], sendline[4096];
    struct sockaddr_in servaddr;

    if (argc != 2) {
        printf("usage: ./client <port>\n");
        exit(0);
    }   

    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
        printf("create socket error: %s(errno: %d)\n",
               strerror(errno), errno);
        exit(0);
    }   

    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(8888);
    //servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    if (inet_pton(AF_INET,argv[1], &servaddr.sin_addr) <= 0) {
        printf("inet_pton error for %s\n", argv[1]);
        exit(0);
    }   
    if (connect
        (sockfd, (struct sockaddr *) &servaddr,
         sizeof(servaddr)) < 0) {
        printf("connect error: %s(errno: %d)\n", strerror(errno),
               errno);
        exit(0);
    }   

    while(1){
    printf("send msg to server: \n");
    fgets(sendline, 4096, stdin);
    if (send(sockfd, sendline, strlen(sendline), 0) < 0) {
        printf("send msg error: %s(errno: %d)\n", strerror(errno),
               errno);
        exit(0);
        }
    }   

    close(sockfd);
    exit(0);
}

這 只是實現簡單的通信,要實現聊天室的話你需要至少做以下一些事:
(1)使用數據庫,例如mysql管理客戶的賬戶信息
(2)我給你的代碼只是單進程模型,而一個聊天室應該是針對大量用戶的,
所以你應該寫的是並發服務器,在linux你可以使用epoll多路復用配合多線程,
當然,最好是用線程池效率更加高
(3)至於,web方面,你還應該會編寫CGI以調用mysql數據
(4)最後,我建議,要是真想了解socket通訊,你應該精通我給你的代碼
然後再客服通訊時,自己抓包分析,(推薦用wireshark軟件抓包)
這樣你才能真正的理解所謂的三次握手(當然,這是我當初理解socket通訊過程的方式)
希望對你有幫助!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved