socket编程TCP实现简单聊天功能

合集下载

socket编程聊天室基本流程

socket编程聊天室基本流程

socket编程聊天室基本流程一、引言Socket编程是一种用于网络通信的编程技术。

它允许程序员创建客户端和服务器应用程序,这些应用程序可以在不同的计算机上运行并通过Internet或局域网相互通信。

在本文中,我们将介绍Socket编程聊天室的基本流程。

二、Socket编程概述Socket编程是一种基于TCP/IP协议的网络编程技术。

它使用套接字(socket)来实现网络通信。

套接字是一种抽象概念,它表示一个网络连接点,可以用来发送和接收数据。

在Socket编程中,客户端和服务器之间建立一个连接,然后通过这个连接进行数据传输。

客户端向服务器发送请求,并等待服务器响应。

服务器接收请求并处理它,并将响应发送回客户端。

三、Socket编程聊天室基本流程1. 创建服务器程序首先,我们需要创建一个服务器程序来监听客户端连接请求。

在Python中,可以使用socket模块来创建套接字对象,并使用bind()方法将其绑定到指定的IP地址和端口号上。

2. 创建客户端程序然后,我们需要创建一个客户端程序来连接到服务器。

同样地,在Python中可以使用socket模块来创建套接字对象,并使用connect()方法连接到指定的IP地址和端口号上。

3. 实现消息传输一旦客户端和服务器之间建立了连接,它们就可以开始进行消息传输。

在Socket编程中,可以使用send()方法将数据发送到对方,使用recv()方法从对方接收数据。

4. 实现聊天室功能为了实现聊天室功能,我们需要让多个客户端能够同时连接到服务器,并且能够相互通信。

为此,我们可以使用多线程或异步编程技术来实现。

在多线程模式下,每个客户端连接都会被分配一个独立的线程来处理。

这个线程负责接收客户端发送的消息,并将其转发给其他客户端。

在异步编程模式下,我们可以使用协程或回调函数来处理消息传输。

当有新的消息到达时,就会触发相应的回调函数进行处理。

5. 实现用户管理为了实现用户管理功能,我们需要让每个客户端都能够注册一个唯一的用户名,并且能够查看当前在线的用户列表。

socket实例C语言:一个简单的聊天程序

socket实例C语言:一个简单的聊天程序

socket实例C语⾔:⼀个简单的聊天程序我们⽼师让写⼀个简单的聊天软件,并且实现不同机⼦之间的通信,我⽤的是SOCKET编程。

不废话多说了,先附上代码:服务器端server.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/types.h>#include <unistd.h>#include <sys/time.h>#define BUFLEN 1024#define PORT 6666#define LISTNUM 20int main(){int sockfd, newfd;struct sockaddr_in s_addr, c_addr;char buf[BUFLEN];socklen_t len;unsigned int port, listnum;fd_set rfds;struct timeval tv;int retval,maxfd;/*建⽴socket*/if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){perror("socket");exit(errno);}elseprintf("socket create success!\n");memset(&s_addr,0,sizeof(s_addr));s_addr.sin_family = AF_INET;s_addr.sin_port = htons(PORT);s_addr.sin_addr.s_addr = htons(INADDR_ANY);/*把地址和端⼝帮定到套接字上*/if((bind(sockfd, (struct sockaddr*) &s_addr,sizeof(struct sockaddr))) == -1){perror("bind");exit(errno);}elseprintf("bind success!\n");/*侦听本地端⼝*/if(listen(sockfd,listnum) == -1){perror("listen");exit(errno);}elseprintf("the server is listening!\n");while(1){printf("*****************聊天开始***************\n");len = sizeof(struct sockaddr);if((newfd = accept(sockfd,(struct sockaddr*) &c_addr, &len)) == -1){perror("accept");exit(errno);}elseprintf("正在与您聊天的客户端是:%s: %d\n",inet_ntoa(c_addr.sin_addr),ntohs(c_addr.sin_port));while(1){FD_ZERO(&rfds);FD_SET(0, &rfds);maxfd = 0;FD_SET(newfd, &rfds);/*找出⽂件描述符集合中最⼤的⽂件描述符*/if(maxfd < newfd)maxfd = newfd;/*设置超时时间*/_sec = 6;_usec = 0;/*等待聊天*/retval = select(maxfd+1, &rfds, NULL, NULL, &tv);if(retval == -1){printf("select出错,与该客户端连接的程序将退出\n");break;}else if(retval == 0){printf("waiting...\n");continue;}else{/*⽤户输⼊信息了*/if(FD_ISSET(0, &rfds)){/******发送消息*******/memset(buf,0,sizeof(buf));/*fgets函数:从流中读取BUFLEN-1个字符*/ fgets(buf,BUFLEN,stdin);/*打印发送的消息*///fputs(buf,stdout);if(!strncasecmp(buf,"quit",4)){printf("server 请求终⽌聊天!\n");break;}len = send(newfd,buf,strlen(buf),0);if(len > 0)printf("\t消息发送成功:%s\n",buf);else{printf("消息发送失败!\n");break;}}/*客户端发来了消息*/if(FD_ISSET(newfd, &rfds)){/******接收消息*******/memset(buf,0,sizeof(buf));/*fgets函数:从流中读取BUFLEN-1个字符*/ len = recv(newfd,buf,BUFLEN,0);if(len > 0)printf("客户端发来的信息是:%s\n",buf);else{if(len < 0 )printf("接受消息失败!\n");elseprintf("客户端退出了,聊天终⽌!\n");break;}}}}/*关闭聊天的套接字*/close(newfd);/*是否退出服务器*/printf("服务器是否退出程序:y->是;n->否? ");bzero(buf, BUFLEN);fgets(buf,BUFLEN, stdin);if(!strncasecmp(buf,"y",1)){printf("server 退出!\n");break;}}/*关闭服务器的套接字*/close(sockfd);return0;}客户端client.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/types.h>#include <unistd.h>#include <sys/time.h>#define BUFLEN 1024#define PORT 6666int main(int argc, char **argv){int sockfd;struct sockaddr_in s_addr;socklen_t len;unsigned int port;char buf[BUFLEN];fd_set rfds;struct timeval tv;int retval, maxfd;/*建⽴socket*/if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){perror("socket");exit(errno);}elseprintf("socket create success!\n");/*设置服务器ip*/memset(&s_addr,0,sizeof(s_addr));s_addr.sin_family = AF_INET;s_addr.sin_port = htons(PORT);if (inet_aton(argv[1], (struct in_addr *)&s_addr.sin_addr.s_addr) == 0) {perror(argv[1]);exit(errno);}/*开始连接服务器*/if(connect(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr)) == -1){ perror("connect");exit(errno);}elseprintf("conncet success!\n");while(1){FD_ZERO(&rfds);FD_SET(0, &rfds);maxfd = 0;FD_SET(sockfd, &rfds);if(maxfd < sockfd)maxfd = sockfd;_sec = 6;_usec = 0;retval = select(maxfd+1, &rfds, NULL, NULL, &tv);if(retval == -1){printf("select出错,客户端程序退出\n");break;}else if(retval == 0){printf("waiting...\n");continue;}else{/*服务器发来了消息*/if(FD_ISSET(sockfd,&rfds)){/******接收消息*******/bzero(buf,BUFLEN);len = recv(sockfd,buf,BUFLEN,0);if(len > 0)printf("服务器发来的消息是:%s\n",buf);else{if(len < 0 )printf("接受消息失败!\n");elseprintf("服务器退出了,聊天终⽌!\n");break;}}/*⽤户输⼊信息了,开始处理信息并发送*/if(FD_ISSET(0, &rfds)){/******发送消息*******/bzero(buf,BUFLEN);fgets(buf,BUFLEN,stdin);if(!strncasecmp(buf,"quit",4)){printf("client 请求终⽌聊天!\n");break;}len = send(sockfd,buf,strlen(buf),0);if(len > 0)printf("\t消息发送成功:%s\n",buf);else{printf("消息发送失败!\n");break;}}}}/*关闭连接*/close(sockfd);return0;}在程序的服务端输⼊lwp@lwp-linux:~/Desktop/1234$ ./server在程序的客户端输⼊lwp@lwp-linux:~/Desktop/1234$ ./client 192.168.100.80当然这都是我在我的机⼦上截的图,客户端我们可以放到任何⼀台机⼦上,只要保证都能在同⼀个局域⽹下,连到我的IP地址就⾏。

socket tcp会话原理

socket tcp会话原理

Socket TCP会话原理一、概述1.1 Socket概念Socket(套接字)是网络通信的基础,它是网络通信的端点,能够实现不同主机之间的数据传输。

1.2 TCP协议TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层协议,它提供了可靠的数据传输和对数据包进行排序和错误校正的功能。

二、TCP会话建立2.1 三次握手2.1.1 第一次握手:客户端发送SYN报文,告诉服务端客户端想要连接。

2.1.2 第二次握手:服务端接收到客户端的SYN报文后,发送SYN+ACK报文,告诉客户端已经收到请求,愿意接受连接。

2.1.3 第三次握手:客户端接收到服务端的SYN+ACK报文后,发送ACK报文确认,表示连接建立成功。

2.2 会话数据传输在TCP会话建立成功后,双方可以进行数据的传输,数据包会通过网络传输到目的地,并且在接收端按序组装成完整的数据流。

三、TCP会话终止3.1 四次挥手3.1.1 第一次挥手:客户端发送FIN报文,表示数据发送完毕。

3.1.2 第二次挥手:服务端接收到FIN报文后,发送ACK报文,表示收到了客户端的结束信号。

3.1.3 第三次挥手:服务端发送FIN报文,表示服务端数据发送完毕。

3.1.4 第四次挥手:客户端接收到服务端的FIN报文后,发送ACK报文,表示收到了服务端的结束信号。

四、TCP会话的特点4.1 可靠性TCP提供了可靠的数据传输,通过序列号、确认和重传机制来确保数据的正确性和完整性。

4.2 有序性TCP会话可以保证数据包的有序到达,不会出现数据包乱序的情况。

4.3 全双工TCP会话是全双工的,双方可以同时进行数据的发送和接收,实现真正的双向通信。

五、TCP会话的应用5.1 网络通信TCP会话被广泛应用于各种网络通信场景,如HTTP、FTP等应用层协议都是基于TCP协议的。

5.2 远程登入SSH等远程登入工具使用TCP会话来建立客户端与服务端之间的连接,实现远程管理和操作。

socket编程聊天室基本流程

socket编程聊天室基本流程

socket编程聊天室基本流程
1. 客户端连接服务端
客户端程序先会建立和服务端程序的连接,一般来说客户端程序需要指定服务端程序的ip地址和端口号,通过使用socket函数来建立一个TCP连接,如果连接成功的话,就会返回一个相应的套接字描述符。

2. 客户端发送消息
客户端程序在连接成功后,就可以向服务端发送消息,将需要发送的数据通过使用send函数发送到服务端,服务端收到数据后,就可以做出相应的处理。

3. 服务端接收客户端消息
同样也是使用recv函数来接收客户端发来的消息,当服务端收到数据后,就可以进行相应的处理,如果是聊天室中的话,就可以把客户端发送来的消息转发给其他的客户端。

4. 服务端向客户端发送消息
服务端在收到客户端发来的消息后,就可以把处理完的结果发送到客户端,使用send函数就可以把数据发送到客户端,当客户端收到消息后,就可以将消息转发给用户。

5. 客户端关闭连接
客户端程序在使用完聊天室后,就可以选择关闭连接,只需要调用close函数就可以关闭相应的套接字描述符,当服务端收到客户端关闭请求后,就会向客户端发送确认信号,然后就可以关闭客户端的
连接。

C++基于socketUDP网络编程实现简单聊天室功能

C++基于socketUDP网络编程实现简单聊天室功能

C++基于socketUDP⽹络编程实现简单聊天室功能本⽂实例为⼤家分享了C++基于socket UDP实现简单聊天室功能的具体代码,供⼤家参考,具体内容如下0.通信步骤流程图(左:服务器;右:客户端;)1.服务器代码1.1服务器类头⽂件(CServer_UDP.h)#pragma once#include <winsock2.h>class CServer_UDP{public:CServer_UDP();void SendMsg(const char sendBuf[]);void RecMsg();~CServer_UDP();private:SOCKET m_sServer;struct sockaddr_in m_SocAddrClient; //建⽴连接时,⽤于保存客户端信息bool m_terminal;};1.2服务器类源⽂件(CServer_UDP.cpp)#define _WINSOCK_DEPRECATED_NO_WARNINGS#include "CServer_UDP.h"#include <iostream>#pragma comment(lib, "ws2_32.lib")CServer_UDP::CServer_UDP():m_terminal(false){//必须进⾏如下初始化,否则socket()会返回10093错误//初始化WSAWORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0) //通过⼀个进程初始化ws2_32.dll{std::cout << "Initialize WSA failed" << std::endl;return;}//初始化UDDP套接字m_sServer = socket(AF_INET, SOCK_DGRAM, 0);struct sockaddr_in m_SocAddrserver;m_SocAddrserver.sin_addr.S_un.S_addr = 0;//htonl(INADDR_ANY);m_SocAddrserver.sin_family = AF_INET;m_SocAddrserver.sin_port = htons(8090);int ret = bind(m_sServer, (sockaddr*)&m_SocAddrserver, sizeof(m_SocAddrserver));if (ret == -1){std::cout << "bind failed!" << std::endl;WSACleanup();}else{//此处必须赋初值,不然会导致服务器端⽆法正常发送int len_Client = sizeof(sockaddr);char recBuf[1025];int len = recvfrom(m_sServer, recBuf, 1024, 0, (sockaddr*)&m_SocAddrClient, &len_Client);if (len > 0){recBuf[len] = '\0';std::cout << "Client say:" << recBuf << std::endl;}}}void CServer_UDP::SendMsg(const char sendBuf[]){int ret = sendto(m_sServer, sendBuf, strlen(sendBuf), 0, (sockaddr*)&m_SocAddrClient, sizeof(m_SocAddrClient)); if (ret == -1){std::cout << "send failed" << std::endl;std::cout << GetLastError()<< std::endl;}}void CServer_UDP::RecMsg(){char recBuf[1025];while (!m_terminal){//std::cout << "Begin rec...(server)" << std::endl;int len = recvfrom(m_sServer, recBuf, 1024, 0, 0, 0);if (len > 0){recBuf[len] = '\0';std::cout << "Client say:" << recBuf << std::endl;}}}CServer_UDP::~CServer_UDP(){closesocket(m_sServer);WSACleanup();}1.3服务器主函数#include <iostream>#include <thread>#include <string>#include "CServer_UDP.h"using namespace std;int main(){CServer_UDP server_UDP;thread recProc(&CServer_UDP::RecMsg, &server_UDP);while (1){//cout << "Pleaes input content:" << endl;string content;cin >> content;server_UDP.SendMsg(content.c_str());}recProc.join();cout << "I love china!" << endl;system("pause");return 0;}2.客户端代码2.1客户端类头⽂件(CClient.h)#pragma once#include <winsock2.h>class CClient{public:CClient();void RecMsg();void SendMsg(const char sendBuf[]);~CClient();private:SOCKET m_sockClient;sockaddr_in m_TargetServer;};2.2客户端类源⽂件(CClient.cpp)#define _WINSOCK_DEPRECATED_NO_WARNINGS#include "CClient.h"#include <iostream>#pragma comment(lib, "ws2_32.lib")CClient::CClient(){//必须进⾏如下初始化,否则socket()会返回10093错误//初始化WSAWORD sockVersion = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(sockVersion, &wsaData) != 0) //通过⼀个进程初始化ws2_32.dll{std::cout << "Initialize WSA failed" << std::endl;return;}m_sockClient = socket(AF_INET, SOCK_DGRAM, 0);m_TargetServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");m_TargetServer.sin_family = AF_INET;m_TargetServer.sin_port = htons(8090);if (m_sockClient == -1){std::cout << "Create socket failed!" << std::endl;WSACleanup();}else{//发送信息与服务器建⽴连接(必须加)sendto(m_sockClient, "hello server", strlen("hello server"), 0, (sockaddr*)&m_TargetServer, sizeof(m_TargetServer)); }}void CClient::SendMsg(const char sendBuf[]){sendto(m_sockClient, sendBuf, strlen(sendBuf), 0, (sockaddr*)&m_TargetServer, sizeof(m_TargetServer));}void CClient::RecMsg(){char recBuf[1025];while (1){//std::cout << "Begin rec...(client)" << std::endl;int len = recvfrom(m_sockClient, recBuf, 1024, 0, 0, 0);if (len > 0){recBuf[len] = '\0';std::cout << "Server say: " << recBuf << std::endl;}}}CClient::~CClient(){closesocket(m_sockClient);WSACleanup();}2.3客户端主函数#include <iostream>#include <string>#include <thread>#include "CClient.h"using namespace std;int main(){CClient client_UDP;thread RecProc(&CClient::RecMsg, &client_UDP); while (1){//cout << "Please input content:" << endl;string content;cin >> content;client_UDP.SendMsg(content.c_str());}RecProc.join();cout << "I love china!" << endl;system("pause");return 0;}3.效果图(win7+VS2017)3.1服务端3.2客户端以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

一种基于TCP的网络聊天软件实现

一种基于TCP的网络聊天软件实现

一种基于TCP的网络聊天软件实现1.简介网络聊天软件是在线沟通交流的重要工具。

基于TCP的网络聊天软件可以通过建立TCP连接,实现客户端和服务器之间的实时聊天功能。

本文将介绍一种基于TCP的网络聊天软件实现方法。

2.技术实现(1)客户端和服务器的连接建立客户端与服务器之间的连接可以通过socket编程实现。

客户端创建一个套接字,然后使用服务器的IP地址和端口号将套接字连接到服务器上的套接字。

服务器端负责接受来自客户端的连接请求,并创建一个新的线程以处理客户端的请求。

(2)用户注册和登录功能在网络聊天软件中,用户需要注册和登录才能使用聊天功能。

当用户第一次打开软件时,需要注册一个新的用户账号。

注册时,客户端将用户提供的用户名和密码发送给服务器进行验证,服务器将用户的信息存储到数据库中。

当用户后续登录时,客户端将用户名和密码发送给服务器进行验证,服务器返回登录成功或失败的结果。

(3)用户聊天功能用户登录后,可以与其他在线用户进行聊天。

客户端可以发送消息给服务器,服务器将接收到的消息广播给所有在线用户。

客户端也可以接收其他用户发送的消息,并在界面上显示出来。

为了实现实时聊天功能,客户端和服务器之间可以使用多线程来进行消息的收发。

(4)用户好友管理网络聊天软件通常提供好友管理功能,用户可以添加好友、删除好友,并查看自己的好友列表。

在基于TCP的聊天软件中,客户端可以发送请求给服务器添加或删除好友。

服务器接收到请求后,将对应的操作应用到数据库中保存的用户信息上。

(5)聊天记录存储网络聊天软件通常提供聊天记录存储功能,用户可以查看之前的聊天记录。

在基于TCP的聊天软件中,服务器可以将接受到的消息和发送的消息保存到数据库中。

用户可以在软件界面上选择查看聊天记录,并根据用户名、时间等条件进行。

3.客户端界面设计网络聊天软件的客户端通常包含登录界面、注册界面和聊天界面。

登录界面用于输入用户名和密码进行登录,注册界面用于注册新用户账号,聊天界面用于显示聊天内容和进行聊天操作。

qtcpsocket案例

qtcpsocket案例

qtcpsocket案例QTcpSocket是Qt框架提供的用于进行TCP通信的类。

它提供了一系列的接口函数,可以实现TCP客户端和服务器端的功能。

下面是一个使用QTcpSocket的案例。

假设我们有一个简单的网络聊天室系统,实现客户端之间的聊天功能。

首先我们需要创建一个客户端,连接到服务器。

客户端发送消息给服务器,当服务器接收到消息后,将消息广播给所有连接到服务器的客户端。

首先创建一个Qt的控制台应用程序,包括头文件`QTcpSocket`。

在主函数中创建一个客户端类`ChatClient`,并调用其成员函数`start`启动客户端。

```cpp#include <QCoreApplication>#include <QTcpSocket>class ChatClient : public QObjectQ_OBJECTpublic:ChatClientsocket = new QTcpSocket(this);connect(socket, &QTcpSocket::connected, this,&ChatClient::onConnected);connect(socket, &QTcpSocket::readyRead, this,&ChatClient::onReadyRead);}void startsocket->connectToHost("localhost", 1234);qDebug( << "Connecting to server...";}private slots:void onConnectedqDebug( << "Connected to server";socket->write("Hello server");}void onReadyReadQString message = QString::fromUtf8(socket->readAll();qDebug( << "Received message:" << message;}private:QTcpSocket* socket;};int main(int argc, char *argv[])QCoreApplication a(argc, argv);ChatClient client;client.start(;return a.exec(;```上面的代码中,我们首先在构造函数中创建了一个`QTcpSocket`对象,并连接了`connected`和`readyRead`信号,分别与`onConnected`和`onReadyRead`槽函数绑定。

基于TCP的简单一对一聊天程序设计

基于TCP的简单一对一聊天程序设计

一、课程设计题目:通过套接字连接进行一对一聊天通信二、实验要求:实现一个一对一的聊天程序。

基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。

服务器和客户端可以是一台电脑的两个进程,也可以分别部署在两台电脑上。

三、原理概述:套接字Socket是一种双向的通信接口,可以通过这个端口与任何一个具有Socket端口的计算机通信,套接字是网络通信的基础。

Socket在Windows以句柄的形式被创建。

使用Socket进行网络通信必须包含下面的几种信息:双方认可的协议,本地主机的IP地址,本地进程的协议端口,对方主机的IP 地址,对方进程的协议端口。

Socket可分为: 1 数据报套接字(Datagram Sockets)——对于在TCP/IP上实现的WinSock,数据报套接字使用用户数据报协议(UDP)。

数据报套接字提供了一种不可靠的、非连接的数据包通信方式。

2 流式套接字(Stream Sockets)——流式套接字使用传输控制协议(TCP)。

流式套接字可以将数据按顺序无重复地发送到目的地,它提供的是一种可靠的、面向连接的数据传输方式。

不管是对单个的数据报,还是对数据包,流式套接字都提供了一种流式数据传输。

VC++对网络编程的支持有socket支持,Winlnet支持,MAPI和ISAPI支持等。

其中Windows Sockets API是TCP/IP网络环境里,也是Internet上进行开发最为通用的API。

IP地址:IP Address就是依照TCP/IP协议分配给本地主机的网络地址,就向两个进程要通讯,任一进程要知道通讯对方的位置,位置如何来确定,就用对方的IP端口号:用来标识本地通讯进程,方便OS提交数据.就是说进程指定了对方进程的网络IP,但这个IP 只是用来标识进程所在的主机,如何来找到运行在这个主机的这个进程呢,就用端口号.连接:指两个进程间的通讯链路.一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机网络报告socket编程TCP实现简单聊天功能java网络编程,通过TCP,Socket实现多对一的局域网聊天室可以实现多个客户端连接服务器,服务器接收到信息就会把信息广播到所有的客户端服务端源码:import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import .Socket;import java.util.List;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;/*这个类是服务器端的UI*/public class ServerUI extends JFrame {public static void main(String[] args) {ServerUI serverUI = new ServerUI();}public JButton btStart;//启动服务器public JButton btSend;//发送信息按钮public JTextField tfSend;//需要发送的文本信息public JTextArea taShow;//信息展示public Server server;//用来监听客户端连接static List<Socket> clients;//保存连接到服务器的客户端public ServerUI() {super("服务器端");btStart = new JButton("启动服务");btSend = new JButton("发送信息");tfSend = new JTextField(10);taShow = new JTextArea();btStart.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {server = new Server(ServerUI.this);}});btSend.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {server.sendMsg(tfSend.getText());tfSend.setText("");}});this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) {int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",JOptionPane.YES_NO_OPTION);if (a == 1) {server.closeServer();System.exit(0); // 关闭}}});JPanel top = new JPanel(new FlowLayout());top.add(tfSend);top.add(btSend);top.add(btStart);this.add(top, BorderLayout.SOUTH);final JScrollPane sp = new JScrollPane();sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_A LW AYS);sp.setViewportView(this.taShow);this.taShow.setEditable(false);this.add(sp, BorderLayout.CENTER);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setSize(400, 300);this.setLocation(100, 200);this.setVisible(true);}}import java.io.BufferedReader;import java.io.IOException;import java.io.PrintWriter;import .ServerSocket;import .Socket;import java.util.ArrayList;/*这个类是服务器端的等待客户端连接*/ public class Server extends Thread {ServerUI ui;ServerSocket ss;BufferedReader reader;PrintWriter writer;public Server(ServerUI ui) {this.ui = ui;this.start();}public void run() {try {ss = new ServerSocket(1228);ui.clients=new ArrayList<Socket>();println("启动服务器成功:端口1228");while (true) {println("等待客户端");Socket client = ss.accept();ui.clients.add(client);println("连接成功" + client.toString());new ListenerClient(ui, client);}} catch (IOException e) {println("启动服务器失败:端口1228");println(e.toString());e.printStackTrace();}}public synchronized void sendMsg(String msg) {try {for (int i = 0; i < ui.clients.size(); i++) {Socket client = ui.clients.get(i);writer = new PrintWriter(client.getOutputStream(),true);writer.println(msg);}} catch (Exception e) {println(e.toString());}}public void println(String s) {if (s != null) {this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n");System.out.println(s + "\n");}}public void closeServer() {try {if (ss != null)ss.close();if (reader != null)reader.close();if (writer != null)writer.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .Socket;/*这个类是服务器端的等待客户端发送信息*/public class ListenerClient extends Thread {BufferedReader reader;PrintWriter writer;ServerUI ui;Socket client;public ListenerClient(ServerUI ui, Socket client) {this.ui = ui;this.client=client;this.start();}//为每一个客户端创建线程等待接收信息,然后把信息广播出去public void run() {String msg = "";while (true) {try {reader = new BufferedReader(new InputStreamReader(client.getInputStream()));writer = new PrintWriter(client.getOutputStream(), true);msg = reader.readLine();sendMsg(msg);} catch (IOException e) {println(e.toString());// e.printStackTrace();break;}if (msg != null && msg.trim() != "") {println(">>" + msg);}}}//把信息广播到所有用户public synchronized void sendMsg(String msg) {try {for (int i = 0; i < ui.clients.size(); i++) {Socket client = ui.clients.get(i);writer = new PrintWriter(client.getOutputStream(), true);writer.println(msg);}} catch (Exception e) {println(e.toString());}}public void println(String s) {if (s != null) {this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n");System.out.println(s + "\n");}}}客户端源码:import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;public class ClientUI extends JFrame {public static void main(String[] args) {ClientUI client = new ClientUI();}public ClientUI() {super("客户端");btStart = new JButton("启动连接");btSend = new JButton("发送信息");tfSend = new JTextField(10);tfIP = new JTextField(10);tfPost = new JTextField(5);taShow = new JTextArea();btStart.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {server = new ClientThread(ClientUI.this);}});btSend.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {server.sendMsg(tfSend.getText());tfSend.setText("");}});this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",JOptionPane.YES_NO_OPTION);if (a == 1) {System.exit(0); // 关闭}}});JPanel top = new JPanel(new FlowLayout());top.add(tfSend);top.add(btSend);top.add(btStart);this.add(top, BorderLayout.SOUTH);final JScrollPane sp = new JScrollPane();sp.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_A LW AYS);sp.setViewportView(this.taShow);this.taShow.setEditable(false);this.add(sp, BorderLayout.CENTER);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);this.setSize(400, 300);this.setLocation(600, 200);this.setVisible(true);}public JButton btStart;public JButton btSend;public JTextField tfSend;public JTextField tfIP;public JTextField tfPost;public JTextArea taShow;public ClientThread server}import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import .Socket;public class ClientThread extends Thread {ClientUI ui;Socket client;BufferedReader reader;PrintWriter writer;public ClientThread(ClientUI ui) {this.ui = ui;try {client = new Socket("127.0.0.1", 1228);//这里设置连接服务器端的IP的端口println("连接服务器成功:端口1228");reader = new BufferedReader(new InputStreamReader(client.getInputStream()));writer = new PrintWriter(client.getOutputStream(), true);// 如果为true,则println、printf 或format 方法将刷新输出缓冲区} catch (IOException e) {println("连接服务器失败:端口1228");println(e.toString());e.printStackTrace();}this.start();}public void run() {String msg = "";while (true) {try {msg = reader.readLine();} catch (IOException e) {println("服务器断开连接");break;}if (msg != null && msg.trim() != "") {println(">>" + msg);}}}public void sendMsg(String msg) {try {writer.println(msg);} catch (Exception e) {println(e.toString());}}public void println(String s) {if (s != null) {this.ui.taShow.setText(this.ui.taShow.getText() + s + "\n");System.out.println(s + "\n");}}}。

相关文档
最新文档