前几天在他人那里看到了网络聊天室的文章,想起了自己几年前也认认真真写过相关编程,实现了服务端,客户端,客户端有c,java,Android三种方式实现,代码只能用来学习相关网络编程,文件操作,多线程等知识,加深对基础知识的理解。

        网络聊天室小项目,可以学习一下网络编程,实现的小功能有保存聊天记录,登录聊天室获取聊天记录,服务端采用c程序实现,客户端采用三种方式,C、java、Android三种方式实现,简易的实现了群聊的过程,同时也使用udp的方式实现了更简易的聊天室,话不多说,上代码。

服务端(C)

1#include ..
  2
  3#define MAXNUM 10
  4#define IP "172.31.207.15"
  5short PORT = 8000;
  6int severSock;
  7int clientSock[MAXNUM];
  8
  9void SendMsg(char *msg)
 10{
 11    int i;
 12    char tempmsg[286];
 13    strcpy(tempmsg, msg);
 14    char nowtime[10];
 15    char sendbuffer[500] = {}; //最终消息发送
 16    time_t t;
 17    struct tm *lt;
 18    time(&t);
 19    lt = localtime(&t);
 20    sprintf(nowtime, "[%d:%d:%d]", lt->tm_hour, lt->tm_min, lt->tm_sec);
 21
 22    strcat(sendbuffer, nowtime);
 23    strcat(sendbuffer, tempmsg);
 24    for (i = 0; i < MAXNUM; ++i)
 25    {
 26        if (clientSock[i] != 0)
 27        {
 28            printf("发送至客户[ %d ]\n", clientSock[i]);
 29            send(clientSock[i], sendbuffer, strlen(sendbuffer), 0);
 30        }
 31    }
 32
 33    FILE * wfile = fopen("./allmsg.txt","a+");
 34    fwrite(sendbuffer,strlen(sendbuffer),1,wfile);
 35    fwrite("\n",strlen("\n"),1,wfile);
 36    fclose(wfile);
 37    printf("消息记录完毕\n");
 38    printf("===================\n");
 39}
 40
 41void *userthread(void *arg)
 42{
 43    //char sendmsg[300];
 44    int usersock = *(int *)arg;
 45    printf("客户 Socket[ %d ]:\n", usersock);
 46    while (1)
 47    {
 48        char usermsg[286] = {};
 49        //memset(sendmsg, 0, sizeof(sendmsg));
 50        memset(usermsg, 0, sizeof(usermsg));
 51        if (recv(usersock, usermsg, sizeof(usermsg), 0) <= 0)
 52        {
 53            int i;
 54            for (i = 0; i < MAXNUM; ++i)
 55            {
 56                if (usersock == clientSock[i])
 57                {
 58                    clientSock[i] = 0;
 59                    break;
 60                }
 61            }
 62
 63            printf("用户 %d 已退出!\n", usersock);
 64            pthread_exit((void *)i);
 65        }
 66
 67        if(strcmp(usermsg,"[online]")==0)
 68        {
 69            printf("%d客户端查询消息记录\n",usersock);
 70            FILE * sendfile = fopen("./allmsg.txt","r");
 71            char allmsg[1024*10]={};
 72            char allmsgsend[1024*11] = {};
 73            fread(allmsg,sizeof(allmsg),1,sendfile);
 74            strcat(allmsgsend,"\n--------漫游记录--------\n");
 75            strcat(allmsgsend,allmsg);
 76            strcat(allmsgsend,"\n-------漫游记录查询完毕---\n");
 77            send(usersock,allmsgsend,strlen(allmsgsend),0);
 78            fclose(sendfile);
 79            printf("==================\n");
 80            continue;
 81        }
 82        SendMsg(usermsg);
 83    }
 84}
 85
 86int main()
 87{
 88    severSock = socket(AF_INET, SOCK_STREAM, 0);
 89    struct sockaddr_in severAddr;
 90    memset(&severAddr, 0, sizeof(severAddr));
 91    severAddr.sin_family = AF_INET;
 92    severAddr.sin_addr.s_addr = inet_addr(IP);
 93    severAddr.sin_port = htons(PORT);
 94
 95    if (bind(severSock, (struct sockaddr *)&severAddr, sizeof(severAddr)) == -1)
 96    {
 97        perror("绑定失败!!!");
 98        exit(-1);
 99    }
100    if (listen(severSock, MAXNUM) == -1)
101    {
102        perror("监听失败!!!");
103        exit(-1);
104    }
105    printf("|****服务器启动成功****|\n");
106    // struct sockaddr_in tempaddr;
107    // socklen_t len = sizeof(tempaddr);
108
109    while (1)
110    {
111        struct sockaddr_in tempaddr;
112        socklen_t len = sizeof(tempaddr);
113        //memset(&tempaddr, 0, sizeof(tempaddr));
114        int sockid = accept(severSock, (struct sockaddr *)&tempaddr, &len);
115        if (sockid == -1)
116        {
117            printf("客户端连接失败!!!\n");
118            continue;
119        }
120        int i = 0;
121        for (i = 0; i < MAXNUM; ++i)
122        {
123            if (clientSock[i] == 0)
124            {
125                clientSock[i] = sockid;
126                printf("新的客户端已连接,socket: %d\n", sockid);
127                pthread_t userthrd;
128                pthread_create(&userthrd, 0, userthread, &sockid);
129                break;
130            }
131
132            if (i == MAXNUM)
133            {
134                char *str = "不好意思,满员了。";
135                send(sockid, str, strlen(str), 0);
136                close(sockid);
137            }
138        }
139    }
140}

客户端(java)

1import java.io.*;
  2import java.net.*;
  3import java.util.*;
  4
  5public class chatconnect {
  6    private static String ipaddr = "47.104.86.151";
  7    static InputStream inStream;
  8    public static String mess=" ";
  9    public static String yname=null;
 10    public static void main(String[] args) {
 11        // TODO Auto-generated method stub
 12        Socket s = null;    
 13        RecvThread rth=new RecvThread();
 14        try {
 15            s =new Socket(ipaddr,8000);
 16        } catch (UnknownHostException e1) {
 17            // TODO Auto-generated catch block
 18            e1.printStackTrace();
 19        } catch (IOException e1) {
 20            // TODO Auto-generated catch block
 21            e1.printStackTrace();
 22        }
 23        OutputStream outputStream = null;
 24        Scanner sc = new Scanner(System.in); 
 25        System.out.println("请输入姓名:");
 26        yname=sc.nextLine();
 27        String message=yname+"进入了聊天室";
 28        try {
 29            s.getOutputStream().write(message.getBytes("UTF-8"));
 30            outputStream = s.getOutputStream();
 31            inStream = s.getInputStream();
 32        } catch (UnsupportedEncodingException e1) {
 33            // TODO Auto-generated catch block
 34            e1.printStackTrace();
 35        } catch (IOException e1) {
 36            // TODO Auto-generated catch block
 37            e1.printStackTrace();
 38        }
 39
 40        try{
 41            rth.start();
 42
 43            while(true){    
 44                mess = sc.nextLine();
 45                String m="[-.-]"+yname+":"+mess;
 46                if(mess.equals("bye")){
 47                    break;
 48                }
 49                if(mess.equals("[聊天记录]")){
 50                    System.out.println("--------本地聊天记录start--------");
 51                    readFile(yname+".txt");
 52                    System.out.println("--------本地聊天记录end--------");
 53                    //mess = null;
 54                }
 55                if(!mess.equals("[聊天记录]")){
 56                    s.getOutputStream().write(m.getBytes("UTF-8"));
 57                }   
 58            }
 59        }catch (Exception e) {
 60
 61        }
 62        String bye=yname+"退出了聊天室";
 63        try {
 64            s.getOutputStream().write(bye.getBytes("UTF-8"));
 65            rth.interrupt();
 66            inStream.close();
 67            outputStream.close();
 68            s.close();
 69        } catch (UnsupportedEncodingException e) {
 70            // TODO Auto-generated catch block
 71            e.printStackTrace();
 72        } catch (IOException e) {
 73            // TODO Auto-generated catch block
 74            e.printStackTrace();
 75        }   
 76
 77        return;
 78    }
 79
 80    public static class RecvThread extends Thread{
 81        @Override
 82        public void run() {
 83            // TODO Auto-generated method stub
 84            while(true){
 85                if(mess.equals("bye")){
 86                    break;
 87                }
 88                try {   
 89                    if (inStream.available() > 0)
 90                    {
 91                        byte[]  recvByte = new byte[1024*2];
 92                        int recvCount= inStream.read(recvByte);
 93
 94                        if (recvCount < 0)
 95                        {
 96                            System.out.println(" ");    
 97                        }else{
 98                            String str = byteArrayToStr(recvByte);
 99                            //String str2 = new String(recvByte,"ANSI");
100                            System.out.println(str.trim());
101                            saveFile(str,yname+".txt");
102                            //System.out.println(new String(br.readLine().getBytes(),"UTF-8"));
103                        }          
104                    }  
105                } 
106                catch (Exception e) {
107
108                }
109            }
110        }
111    }
112
113    public static String byteArrayToStr(byte[] byteArray) {
114        if (byteArray == null) {
115            return null;
116        }
117        String str = null;
118        try {
119            str = new String(byteArray,"UTF-8");
120        } catch (UnsupportedEncodingException e) {
121            // TODO Auto-generated catch block
122            e.printStackTrace();
123        }
124        return str;
125    }
126    public static void readFile(String fileName){
127        //FileReader fr=null;
128        //File file;    
129        BufferedReader buf = null;
130        String str=null;
131        //file = new File("C:\\Users\\Aen\\Desktop\\Chat\\"+fileName);
132        String filen="C:\\Users\\Aen\\Desktop\\Chat\\"+fileName;
133        try {
134            //fr = new FileReader(file);
135            try {
136                buf=new BufferedReader(new InputStreamReader(new FileInputStream(filen),"UTF-8"));
137            } catch (UnsupportedEncodingException e1) {
138                // TODO Auto-generated catch block
139                e1.printStackTrace();
140            }
141            try {
142                while((str = buf.readLine())!=null){
143                    System.out.println(str.trim());
144                }
145            } catch (IOException e) {
146                // TODO Auto-generated catch block
147                e.printStackTrace();
148            }
149        } catch (FileNotFoundException e) {
150            // TODO Auto-generated catch block
151            e.printStackTrace();
152        }finally{
153            if(buf!=null){
154                try {
155                    buf.close();
156                } catch (IOException e) {
157                    // TODO Auto-generated catch block
158                    e.printStackTrace();
159                }
160            }
161        }
162
163    }
164    //保存本地文件
165    public static void saveFile(String content, String fileName){
166        //FileWriter fw=null;
167        File file;     
168        BufferedWriter bw =null;
169        try {      
170           file = new File("C:\\Users\\Aen\\Desktop\\Chat\\"+fileName);
171           String filen="C:\\Users\\Aen\\Desktop\\Chat\\"+fileName;
172           fop = new FileOutputStream(file,true);
173           if (!file.exists()) {
174            file.createNewFile();
175           }
176           //fw = new FileWriter(file,true);
177           bw = new BufferedWriter (new OutputStreamWriter (new FileOutputStream (filen,true),"UTF-8"));
178
179           //BufferedWriter bw = new BufferedWriter(fw);
180           bw.write(content);
181           bw.newLine();
182           //bw.close();   
183        } catch (IOException e) {
184           e.printStackTrace();
185        } finally {
186            if(bw!=null){
187                try {
188                    bw.close();
189                } catch (IOException e) {
190                    // TODO Auto-generated catch block
191                    e.printStackTrace();
192                }
193            }
194        }
195    }
196}

Android端

Android源码过长,不再展示了,同时也有简单的界面。

小结

小项目用了C和java,同时也可以会点Android,笔者不才恰好这几个都会点,到后来C懂得更多一点,这个代码涵盖了网络编程,线程,文件操作,更好的学习一些编程的语言的基本知识。