2 hhooong hhooong 于 2014.12.15 17:11 提问

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

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

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

3个回答

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

save4me
save4me   Ds   Rxr 2014.12.15 17:15
caozhy
caozhy   Ds   Rxr 2014.12.15 17:22

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

C# Socket聊天程序汇总

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!