socket编程TCP实现简单聊天功能
- 格式:doc
- 大小:55.50 KB
- 文档页数:17
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编程。
不废话多说了,先附上代码:服务器端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会话原理一、概述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编程聊天室基本流程
1. 客户端连接服务端
客户端程序先会建立和服务端程序的连接,一般来说客户端程序需要指定服务端程序的ip地址和端口号,通过使用socket函数来建立一个TCP连接,如果连接成功的话,就会返回一个相应的套接字描述符。
2. 客户端发送消息
客户端程序在连接成功后,就可以向服务端发送消息,将需要发送的数据通过使用send函数发送到服务端,服务端收到数据后,就可以做出相应的处理。
3. 服务端接收客户端消息
同样也是使用recv函数来接收客户端发来的消息,当服务端收到数据后,就可以进行相应的处理,如果是聊天室中的话,就可以把客户端发送来的消息转发给其他的客户端。
4. 服务端向客户端发送消息
服务端在收到客户端发来的消息后,就可以把处理完的结果发送到客户端,使用send函数就可以把数据发送到客户端,当客户端收到消息后,就可以将消息转发给用户。
5. 客户端关闭连接
客户端程序在使用完聊天室后,就可以选择关闭连接,只需要调用close函数就可以关闭相应的套接字描述符,当服务端收到客户端关闭请求后,就会向客户端发送确认信号,然后就可以关闭客户端的
连接。
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的网络聊天软件实现1.简介网络聊天软件是在线沟通交流的重要工具。
基于TCP的网络聊天软件可以通过建立TCP连接,实现客户端和服务器之间的实时聊天功能。
本文将介绍一种基于TCP的网络聊天软件实现方法。
2.技术实现(1)客户端和服务器的连接建立客户端与服务器之间的连接可以通过socket编程实现。
客户端创建一个套接字,然后使用服务器的IP地址和端口号将套接字连接到服务器上的套接字。
服务器端负责接受来自客户端的连接请求,并创建一个新的线程以处理客户端的请求。
(2)用户注册和登录功能在网络聊天软件中,用户需要注册和登录才能使用聊天功能。
当用户第一次打开软件时,需要注册一个新的用户账号。
注册时,客户端将用户提供的用户名和密码发送给服务器进行验证,服务器将用户的信息存储到数据库中。
当用户后续登录时,客户端将用户名和密码发送给服务器进行验证,服务器返回登录成功或失败的结果。
(3)用户聊天功能用户登录后,可以与其他在线用户进行聊天。
客户端可以发送消息给服务器,服务器将接收到的消息广播给所有在线用户。
客户端也可以接收其他用户发送的消息,并在界面上显示出来。
为了实现实时聊天功能,客户端和服务器之间可以使用多线程来进行消息的收发。
(4)用户好友管理网络聊天软件通常提供好友管理功能,用户可以添加好友、删除好友,并查看自己的好友列表。
在基于TCP的聊天软件中,客户端可以发送请求给服务器添加或删除好友。
服务器接收到请求后,将对应的操作应用到数据库中保存的用户信息上。
(5)聊天记录存储网络聊天软件通常提供聊天记录存储功能,用户可以查看之前的聊天记录。
在基于TCP的聊天软件中,服务器可以将接受到的消息和发送的消息保存到数据库中。
用户可以在软件界面上选择查看聊天记录,并根据用户名、时间等条件进行。
3.客户端界面设计网络聊天软件的客户端通常包含登录界面、注册界面和聊天界面。
登录界面用于输入用户名和密码进行登录,注册界面用于注册新用户账号,聊天界面用于显示聊天内容和进行聊天操作。
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`槽函数绑定。
一、课程设计题目:通过套接字连接进行一对一聊天通信二、实验要求:实现一个一对一的聊天程序。
基本过程如下:服务器首先启动,创建套接字后等待客户的连接;客户启动以后,创建套接字,然后和服务器建立连接;连接建立后,客户机和服务器可以通过建立的套接字连接进行通信。
服务器和客户端可以是一台电脑的两个进程,也可以分别部署在两台电脑上。
三、原理概述:套接字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.TCP实现大小写转换代码如下import java.io.*;import .*;class TCPServer{public static void main(String argv[]) throws Exception {String ClientSentence;String capitalizedSentence;@SuppressWarnings("resource")ServerSocket welcomeSocket = new ServerSocket(8998);while(true){Socket connectionSocket = welcomeSocket.accept();BufferedReader infromClient =new BufferedReader(new InputStreamReader( connectionSocket.getInputStream()));DataOutputStream outToClient =new DataOutputStream(connectionSocket.getOutputStream());ClientSentence = infromClient. readLine();capitalizedSentence =ClientSentence.toUpperCase() + '\n';outToClient.writeBytes(capitalizedSentence);}}}TCP服务器代码:import java.io.*;import .*;class TCPClient{public static void main(String argv[]) throws Exception {String sentence;String modifiedSentence;BufferedReader infromUser =new BufferedReader(new InputStreamReader(System.in));Socket clientSocket = new Socket("127.0.0.1",8998);DataOutputStream outToServer =new DataOutputStream(clientSocket.getOutputStream());BufferedReader infromServer =new BufferedReader(new InputStreamReader( clientSocket.getInputStream()));sentence = infromUser.readLine();outToServer.writeBytes(sentence + '\n');modifiedSentence = infromServer.readLine();System.out.println("FROM SERVER:"+modifiedSentence);clientSocket.close();}}运行结果截图:2.UDP实现大小写转换UDPServer短代码:import .*;import java.io.*;public class Server {public static void main(String args[])throws SocketException,IOException{DatagramSocket socket;DatagramPacket packet;byte[] buf = new byte[256];int port;InetAddress add;socket = new DatagramSocket(8888);packet = new DatagramPacket(buf,buf.length);boolean b=true;while(b){socket.receive(packet);String s = new String(packet.getData()).trim();System.out.println("服务器接受数据为:"+s);//String str = s-('a'-'A');String str = s.toUpperCase();s=String.valueOf(str);buf = s.getBytes();packet=new DatagramPacket(buf,buf.length,packet.getAddress(),packet.getPort());socket.send(packet);}socket.close();}}UDP客户端代码:import .*;import java.io.*;public class Client {public static void main(String args[])throws SocketException,IOException{DatagramSocket socket = new DatagramSocket();byte[] buf = new byte[256];BufferedReader b = new BufferedReader(new InputStreamReader(System.in));System.out.println("请输入字符串:");String str = b.readLine();char[] c=str.toCharArray();//String str = "a";buf=String.valueOf(c).getBytes();DatagramPacket packet = new DatagramPacket(buf,buf.length,InetAddress.getLocalHost(),8888);socket.send(packet);buf = new byte[256];packet=new DatagramPacket(buf,buf.length);socket.receive(packet);String s=new String(packet.getData()).trim();System.out.println("转换大写为:"+s);socket.close();}}运行结果截图:3.S OCKET编程实现聊天程序服务器代码:package socket;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import java.io.*;import .BindException;import .ServerSocket;import .Socket;import java.util.ArrayList;import java.util.StringTokenizer;public class Server {private JFrame frame;private JTextArea contentArea;private JTextField txt_message;private JTextField txt_max;private JTextField txt_port;private JButton btn_start;private JButton btn_stop;private JButton btn_send;private JPanel northPanel;private JPanel southPanel;private JScrollPane rightPanel;private JScrollPane leftPanel;private JSplitPane centerSplit;private JList userList;private DefaultListModel listModel;private ServerSocket serverSocket;private ServerThread serverThread;private ArrayList<ClientThread> clients;private boolean isStart = false;// 主方法,程序执行入口public static void main(String[] args) {new Server();}// 执行消息发送public void send() {if (!isStart) {JOptionPane.showMessageDialog(frame, "服务器还未启动,不能发送消息!", "错误",JOptionPane.ERROR_MESSAGE);return;}if (clients.size() == 0) {JOptionPane.showMessageDialog(frame, "没有用户在线,不能发送消息!", "错误",JOptionPane.ERROR_MESSAGE);return;}String message = txt_message.getText().trim();if (message == null || message.equals("")) {JOptionPane.showMessageDialog(frame, "消息不能为空!", "错误",JOptionPane.ERROR_MESSAGE);return;}sendServerMessage(message);// 群发服务器消息contentArea.append("服务器说:" + txt_message.getText() + "\n");txt_message.setText(null);}// 构造放法public Server() {frame = new JFrame("服务器");// 更改JFrame的图标:frame.setIconImage(Toolkit.getDefaultToolkit().createImage(Client.class.getResource("qq.png")));contentArea = new JTextArea();contentArea.setEditable(false);contentArea.setForeground(Color.blue);txt_message = new JTextField();txt_max = new JTextField("30");txt_port = new JTextField("6999");btn_start = new JButton("启动");btn_stop = new JButton("停止");btn_send = new JButton("发送");btn_stop.setEnabled(false);listModel = new DefaultListModel();userList = new JList(listModel);southPanel = new JPanel(new BorderLayout());southPanel.setBorder(new TitledBorder("写消息"));southPanel.add(txt_message, "Center");southPanel.add(btn_send, "East");leftPanel = new JScrollPane(userList);leftPanel.setBorder(new TitledBorder("在线用户"));rightPanel = new JScrollPane(contentArea);rightPanel.setBorder(new TitledBorder("消息显示区"));centerSplit = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel,rightPanel);centerSplit.setDividerLocation(100);northPanel = new JPanel();northPanel.setLayout(new GridLayout(1, 6));northPanel.add(new JLabel("人数上限"));northPanel.add(txt_max);northPanel.add(new JLabel("端口"));northPanel.add(txt_port);northPanel.add(btn_start);northPanel.add(btn_stop);northPanel.setBorder(new TitledBorder("配置信息"));frame.setLayout(new BorderLayout());frame.add(northPanel, "North");frame.add(centerSplit, "Center");frame.add(southPanel, "South");frame.setSize(600, 400);int screen_width = Toolkit.getDefaultToolkit().getScreenSize().width;int screen_height = Toolkit.getDefaultToolkit().getScreenSize().height;frame.setLocation((screen_width - frame.getWidth()) / 2,(screen_height - frame.getHeight()) / 2);frame.setVisible(true);// 关闭窗口时事件frame.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {if (isStart) {closeServer();// 关闭服务器}System.exit(0);// 退出程序}});// 文本框按回车键时事件txt_message.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {send();}});// 单击发送按钮时事件btn_send.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent arg0) {send();}});// 单击启动服务器按钮时事件btn_start.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (isStart) {JOptionPane.showMessageDialog(frame, "服务器已处于启动状态,不要重复启动!","错误", JOptionPane.ERROR_MESSAGE);return;}int max;int port;try {try {max = Integer.parseInt(txt_max.getText());} catch (Exception e1) {throw new Exception("人数上限为正整数!");}if (max <= 0) {throw new Exception("人数上限为正整数!");}try {port = Integer.parseInt(txt_port.getText());} catch (Exception e1) {throw new Exception("端口号为正整数!");}if (port <= 0) {throw new Exception("端口号为正整数!");}serverStart(max, port);contentArea.append("服务器已成功启动!人数上限:" + max + ",端口:" + port+ "\n");JOptionPane.showMessageDialog(frame, "服务器成功启动!");btn_start.setEnabled(false);txt_max.setEnabled(false);txt_port.setEnabled(false);btn_stop.setEnabled(true);} catch (Exception exc) {JOptionPane.showMessageDialog(frame,exc.getMessage(),"错误", JOptionPane.ERROR_MESSAGE);}}});// 单击停止服务器按钮时事件btn_stop.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (!isStart) {JOptionPane.showMessageDialog(frame, "服务器还未启动,无需停止!", "错误",JOptionPane.ERROR_MESSAGE);return;}try {closeServer();btn_start.setEnabled(true);txt_max.setEnabled(true);txt_port.setEnabled(true);btn_stop.setEnabled(false);contentArea.append("服务器成功停止!\n");JOptionPane.showMessageDialog(frame, "服务器成功停止!");} catch (Exception exc) {JOptionPane.showMessageDialog(frame, "停止服务器发生异常!", "错误",JOptionPane.ERROR_MESSAGE);}}});}// 启动服务器public void serverStart(int max, int port) throws .BindException { try {clients = new ArrayList<ClientThread>();serverSocket = new ServerSocket(port);serverThread = new ServerThread(serverSocket, max);serverThread.start();isStart = true;} catch (BindException e) {isStart = false;throw new BindException("端口号已被占用,请换一个!");} catch (Exception e1) {e1.printStackTrace();isStart = false;throw new BindException("启动服务器异常!");}}// 关闭服务器@SuppressWarnings("deprecation")public void closeServer() {try {if (serverThread != null)serverThread.stop();// 停止服务器线程for (int i = clients.size() - 1; i >= 0; i--) {// 给所有在线用户发送关闭命令clients.get(i).getWriter().println("CLOSE");clients.get(i).getWriter().flush();// 释放资源clients.get(i).stop();// 停止此条为客户端服务的线程clients.get(i).reader.close();clients.get(i).writer.close();clients.get(i).socket.close();clients.remove(i);}if (serverSocket != null) {serverSocket.close();// 关闭服务器端连接}listModel.removeAllElements();// 清空用户列表isStart = false;} catch (IOException e) {e.printStackTrace();isStart = true;}}// 群发服务器消息public void sendServerMessage(String message) {for (int i = clients.size() - 1; i >= 0; i--) {clients.get(i).getWriter().println("服务器:" + message + "(多人发送)");clients.get(i).getWriter().flush();}}// 服务器线程class ServerThread extends Thread {private ServerSocket serverSocket;private int max;// 人数上限// 服务器线程的构造方法public ServerThread(ServerSocket serverSocket, int max) {this.serverSocket = serverSocket;this.max = max;}public void run() {while (true) {// 不停的等待客户端的链接try {Socket socket = serverSocket.accept();if (clients.size() == max) {// 如果已达人数上限BufferedReader r = new BufferedReader(newInputStreamReader(socket.getInputStream()));PrintWriter w = new PrintWriter(socket.getOutputStream());// 接收客户端的基本用户信息String inf = r.readLine();StringTokenizer st = new StringTokenizer(inf, "@");User user = new User(st.nextToken(), st.nextToken());// 反馈连接成功信息w.println("MAX@服务器:对不起," +user.getName()+ user.getIp() + ",服务器在线人数已达上限,请稍后尝试连接!");w.flush();// 释放资源r.close();w.close();socket.close();continue;}ClientThread client = new ClientThread(socket);client.start();// 开启对此客户端服务的线程clients.add(client);listModel.addElement(client.getUser().getName());// 更新在线列表contentArea.append(client.getUser().getName()+ client.getUser().getIp() + "上线!\n");} catch (IOException e) {e.printStackTrace();}}}}// 为一个客户端服务的线程class ClientThread extends Thread {private Socket socket;private BufferedReader reader;private PrintWriter writer;private User user;public BufferedReader getReader() {return reader;}public PrintWriter getWriter() {return writer;}public User getUser() {return user;}// 客户端线程的构造方法public ClientThread(Socket socket) {try {this.socket = socket;reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));writer = new PrintWriter(socket.getOutputStream());// 接收客户端的基本用户信息String inf = reader.readLine();StringTokenizer st = new StringTokenizer(inf, "@");user = new User(st.nextToken(), st.nextToken());// 反馈连接成功信息writer.println(user.getName() + user.getIp() + "与服务器连接成功!");writer.flush();// 反馈当前在线用户信息if (clients.size() > 0) {String temp = "";for (int i = clients.size() - 1; i >= 0; i--) {temp += (clients.get(i).getUser().getName() + "/" + clients.get(i).getUser().getIp())+ "@";}writer.println("USERLIST@" + clients.size() + "@" + temp);writer.flush();}// 向所有在线用户发送该用户上线命令for (int i = clients.size() - 1; i >= 0; i--) {clients.get(i).getWriter().println("ADD@" + user.getName() + user.getIp());clients.get(i).getWriter().flush();}} catch (IOException e) {e.printStackTrace();}}@SuppressWarnings("deprecation")public void run() {// 不断接收客户端的消息,进行处理。
本文由我司收集整编,推荐下载,如有疑问,请与我司联系Socket编程一实现简易的聊天功能以及文件传输2017/02/21 0 干程序是一件枯燥重复的事,每当感到内心浮躁的时候,我就会找小说来看。
我从小就喜爱看武侠小说,一直有着武侠梦。
从金庸,古龙,梁羽生系列到凤歌(昆仑),孙晓(英雄志)以及萧鼎的(诛仙)让我领略着不一样的江湖。
如果你有好看的武侠系列小说,给我留言哦。
题外话就扯这么多了,接着还是上技术。
看看今天实现的功能效果图: 可以这里使用多台手机进行通讯,【凤歌】我采用的服务器发送消息。
是不是只有发送消息,有些显得太单调了。
好,在发送消息的基础上增加文件传输。
后期会增加视频,音频的传输,增加表情包。
那一起来看看图文消息的效果图,带领大家一起来实现通讯的简易聊天功能。
需要解决的难点: 如何判断socket接收的数据是字符串还是流?如果你已是一名老司机,还请留言给出宝贵意见。
带着这个疑问我们接着往下看。
Socket概述Socket我们称之为”套接字”,用于消息通知系统(如:激光推送),时事通讯系统(如:环信)等等。
用于描述IP地址和端口,是一个通信链的句柄。
网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket,一个Socket由一个IP地址和一个端口号唯一确定(如:ServerSocket)。
应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
Socket是TCP/IP协议的一个十分流行的编程界面,但是,Socket所支持的协议种类也不光TCP/IP一种,因此两者之间是没有必然联系的。
在Java环境下,Socket编程主要是指基于TCP/IP协议的网络编程。
java包下有两个类:Socket和ServerSocket,基于TCP协议。
本文针对Socket和ServerSocket作主要讲解。
socket连接建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为。
计算机网络报告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");}}}。