Nucky_ 2014-12-15 09:11 采纳率: 33.3%
浏览 2697
已采纳

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

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

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

  • 写回答

3条回答

  • Landpack 2014-12-15 09:54
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 ubuntu系统下挂载磁盘上执行./提示权限不够
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误