hhooong
Nucky_
采纳率33.3%
2014-12-15 09:11

如何利用C#和socket做出一个聊天室

10
已采纳

1.进一步熟悉和掌握TCP/IP协议的原理。
2.初步了解网络环境下的程序设计步骤与过程。
3.初步掌握Winsock提供的函数的功能与使用方法。
4.理解网络的Socket通信。
5.利用Winsock编写基于TCP或UDP协议的C/S模式网络通信软件——一个类似QQ的网络聊天工具。

这是我们期末大作业的要求,需要用到的只是大概有C# ,socker , MYSQL ,不知道有什么办法做成这个,或者有大神可以推荐下C#和MYSQL的自学视频之类的么,
所涉及的深度只要能完成大实验就行,谢谢了~

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

3条回答

  • u011767611 Landpack 7年前

    至于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通讯过程的方式)
    希望对你有帮助!

    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 7年前

    这样的代码有很多,参考:

    C# Socket聊天程序汇总

    点赞 1 评论 复制链接分享
  • save4me save4me 7年前