计算机网络老师为大家留了几个实验的作业,其中一个是使用socket实现通信聊天。对于socket,我以前只是听说过名字,并没有今题研究过是怎么回事。所以我就花了两天时间来了解一下具体的含义。
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。
比较重要的是socket的连接过程,因为只有明白了socket的连接过程,才会使用socket。
socket之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。
(1)服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。
(2)客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。
(3)连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。
这是原理图:
那么接下来我们尝试使用C语言实现socket的进程通信。
具体的源码如下:
clientA:
#include "stdio.h"
#include
#include
#pragma comment(lib,"ws2_32")
int main(){
Sleep(2000); //沉睡2秒再连接server
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET s=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//初始化服务器socket
sockaddr_in sockaddr;
sockaddr.sin_family=PF_INET;
sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
//绑定ip地址
sockaddr.sin_port=htons(9000);
//绑定端口
connect(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));
//进行连接
char buffer[MAXBYTE]={0};
recv(s, buffer, MAXBYTE, NULL);
//接收缓冲区数据
printf("%s", buffer);
//打印
while(TRUE)
{
char buffer2[MAXBYTE]={0};
int receive_result = recv(s, buffer2, MAXBYTE, NULL);//返回接收信息的长度
printf("客户端B对你说:%s\n", buffer2);
if(receive_result){ //如果收到了消息,打印出来,否则发送消息
char* mymsg=new char[100000];
printf("你对客户端B说:");
gets(mymsg); //获取输入的内容
send(s, mymsg, strlen(mymsg)+sizeof(char), NULL);//将内容发送到缓冲区
}
}
closesocket(s); //关闭socket
WSACleanup(); //终止
getchar();
return 0;
}
clientB:
#include
#include
#include
#pragma comment (lib,"ws2_32")
int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
sockaddr_in sockaddr;
sockaddr.sin_family = PF_INET;
sockaddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
sockaddr.sin_port = htons(9000);
bind(s, (SOCKADDR*)&sockaddr, sizeof(SOCKADDR));
listen(s, 1); //对端口进行监听
//printf("正在监听端口 [%d].\n", 9000);
while(TRUE)
{
SOCKADDR clientAddr;
int size=sizeof(SOCKADDR);
SOCKET clientsocket;
clientsocket=accept(s, &clientAddr, &size);
printf("客户端A成功上线.\n");
char* msg="客户端B成功上线.\r\n";
send(clientsocket, msg, strlen(msg)+sizeof(char), NULL); //发送内容给客户端a
while(TRUE)
{
char *mymsg=new char[100000];
printf("对客户端A说:");
gets(mymsg);
int send_result = send(clientsocket, mymsg, strlen(msg)+sizeof(char), NULL);
if(send_result){
char buffer[MAXBYTE]={0};
recv(clientsocket, buffer, MAXBYTE, NULL);
printf("客户端A对你说:%s\n", buffer);
}
}
closesocket(clientsocket);
}
closesocket(s);
WSACleanup();
getchar();
exit(0);
return 0;
}
实现效果:
参考博客:http://www.cnblogs.com/aarond/p/CSocket.html