基于C/S模式的简单聊天程序(客户端篇)

本文介绍了使用Java编程实现的C/S模式简单聊天程序的客户端部分。客户端通过设置端口和服务器地址,创建套接字进行通信。功能包括发送和接收消息,登录时建立与服务器连接并启动接收线程。发送线程在用户点击发送按钮时,将消息写入数据流并清空输入框;接收线程则持续读取服务器数据流并显示在文本展示区。
摘要由CSDN通过智能技术生成

经过这几天对java的学习,用java做了这个计算机网络的课程设计,基于C/S模式的简单聊天程序,此篇文章介绍一些客户端的一些东西。
先讲一讲此聊天程序的基本原理,客户端发送消息至服务器,服务器收到消息之后将其转发给连接服务器的所有客户端,来自客户端的消息中包含发件人的名字。
客户端的主要功能是发送消息和接收消息,客户端设置好了端口和服务器地址,并创立客户端自己的套接字,用作和服务器通信的一个标识。布局就不多说了,主要说说监视器和两个重要的线程:发送和接收。
监视器中,登录按钮触发的功能是设置用户名,并且建立和服务器的连接,同时还要创建接收线程,并使其开始运行。
下面说一说,发送和接收的线程:发送线程是建立数据输出流,将想要文本输入区中的消息以UTF字符串的形式写入到数据流中,并且在发送成功后清空输入框。并且该线程由“发送”按钮触发。
接收线程是在登录之后就建立的,线程中建立输入流,并且读出流中的UTF字符串,将其显示到文本展示区,就完成了信息的接收。
客户端大致的功能和组成就是这些了,下一篇我将讲一下有关服务器的东西。
界面展示:
这里写图片描述

package client;

import java.awt.*;
import java.awt.event.*
简单聊天程序采用了C/S模式,即客户端/服务器模式客户端通过与服务器建立连接,实现与其他客户端聊天交流。 服务器端程序: 1. 建立服务器端socket,监听客户端连接请求。 2. 接收客户端连接请求,并建立连接。 3. 接收客户端发来的消息,广播给所有已连接的客户端。 4. 关闭连接。 客户端程序: 1. 建立客户端socket,连接服务器。 2. 发送消息给服务器。 3. 接收服务器广播的消息,显示在客户端界面上。 4. 关闭连接。 下面是服务器端程序的实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 1234 #define BACKLOG 5 #define MAXDATASIZE 100 int main() { int sockfd, client_fd; struct sockaddr_in my_addr; struct sockaddr_in remote_addr; int sin_size; char buf[MAXDATASIZE]; int recvbytes; if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } printf("socket success!,sockfd=%d\n",sockfd); my_addr.sin_family = AF_INET; my_addr.sin_port = htons(PORT); my_addr.sin_addr.s_addr = INADDR_ANY; bzero(&(my_addr.sin_zero), 8); if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) { perror("bind"); exit(1); } printf("bind success!\n"); if (listen(sockfd, BACKLOG) == -1) { perror("listen"); exit(1); } printf("listening....\n"); while(1) { sin_size = sizeof(struct sockaddr_in); if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1) { perror("accept"); continue; } printf("received a connection from %s:%d\n", inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port)); if (!fork()) { if (send(client_fd, "Welcome to my server\n", 22, 0) == -1) perror("send"); while (recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) { buf[recvbytes] = '\0'; printf("received a message from %s:%d :%s\n", inet_ntoa(remote_addr.sin_addr), ntohs(remote_addr.sin_port), buf); if (send(client_fd, buf, recvbytes, 0) == -1) perror("send"); } close(client_fd); exit(0); } close(client_fd); } close(sockfd); return 0; } ``` 下面是客户端程序的实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define PORT 1234 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { int sockfd, recvbytes; char buf[MAXDATASIZE]; struct sockaddr_in serv_addr; if (argc < 2) { fprintf(stderr, "Please enter the server's hostname!\n"); exit(1); } if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr.s_addr = inet_addr(argv[1]); bzero(&(serv_addr.sin_zero), 8); if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1) { perror("connect"); exit(1); } if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); exit(1); } buf[recvbytes] = '\0'; printf("%s", buf); while(1){ printf("Enter message to send:\n"); fgets(buf, MAXDATASIZE, stdin); if (send(sockfd, buf, strlen(buf), 0) == -1) { perror("send"); exit(1); } if ((recvbytes = recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { perror("recv"); exit(1); } buf[recvbytes] = '\0'; printf("Received: %s",buf); } close(sockfd); return 0; } ``` 运行服务器端程序后,服务器会一直监听客户端请求。运行客户端程序,输入服务器的IP地址,即可与服务器建立连接,开始聊天
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值