⑴ 用C语言在WIN32下编译一个简单的聊天程序,客户端向服务器发消息,服务器接到消息后会返回一个
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<errno.h>
#include<netinet/in.h>
#include<sys/socket.h>
#define SERVERPORT 5555#define BACKLOG 10
#define MAXLEN 1024
int main(){
int sockfd,client_fd;
int sin_size = 0;
int recvlen = 0;
char recvbuf[MAXLEN]={0};
struct sockaddr_in my_addr;
struct sockaddr_in cli_addr;
int iRet;
/*建立socke通信*/
if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
printf("Create socket error\n\n");
exit(1);
}
printf("socket success\n");
my_addr.sin_family=AF_INET; my_addr.sin_port=htons(SERVERPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
memset(my_addr.sin_zero,0,8);
/*绑定socket端口*/
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr)) == -1){
printf("bind error\n");
close(sockfd);
exit(1);
}
printf("bind success\n");
/*监听端口*/
if(listen(sockfd,BACKLOG) == -1){
printf("listen error\n!");
close(sockfd);
exit(1);
}
printf("listren success\n");
while(1) {
sin_size = sizeof(struct sockaddr_in);
/*阻塞等待客户端发送消息*/
if((client_fd=accept(sockfd,(struct sockaddr *)&cli_addr,&sin_size)) == -1)
{
printf("accept error !");
continue;
}
printf("accept success\n");
printf("receive a connection form %s\n",inet_ntoa(cli_addr.sin_addr));
/*fork进程,子进程处理接收的信息*/
iRet=fork();
if(iRet < 0)
{
printf(" fork err, pid=[%d]", getpid());
}
/*fork返回0,为子进程*/
else if(iRet == 0)
{
printf("pid=[%d]", getpid());
printf("子进程\n");
memset(recvbuf,0,sizeof(recvbuf));
/*接收客户端发送的内容*/
if((recvlen = recv(client_fd,recvbuf,MAXLEN,0)) == -1)
{
printf("recv error\n");
close(client_fd);
exit(1);
}
printf("recvlen[%d]\n",recvlen);
printf("recvmsg:\n%s\n",recvbuf);
/*向客户端发送内容*/ if(send(client_fd,recvbuf,recvlen,0) == -1)
{
printf("send error\n");
close(client_fd);
exit(1);
}
printf("sendmsg:\n%s\n",recvbuf);
close(client_fd);
exit(0);
}
/*父进程,返回子进程pid*/
else
{
printf("pid=[%d]", getpid());
printf("父进程\n");
continue;
}
}
close(sockfd);
exit(0);
}
⑵ 如何在linux系统的服务器上进行编译
方法/步骤
打开Myeclipse编辑器,在已经完成的web项目上面点击右键,选择export,然后选择导出成war包,将导出的war包放在桌面或者其他文件夹。
⑶ 进程之间的客户端与服务端是如何实现通讯的
首先,为了便于理解,我们一般把网络分为多个层次,这个层次的概念是很重要的基础概念,你可以参考阅读经典的谢希仁老师翻译的《计算机网络》。 在进程之间的网络通信一般都是在“网络层”即IP层,我们编写程序一般也都是基于这个层次或者这个层次之上的传输层或者应用层。语言(实际上是操作系统和库函数)提供了封装好的函数,让我们可以不用关心链路层以及物理层的细节。 下面逐一回答你的问题: 1)初始化网络环境是什么意思,有什么作用? 为了建立通信连接,我们需要明确当前的网络环境是怎样的,因为和单机系统的进程通信不同,网络进程间通信比较复杂,而且操作系统支持的网络协议也会很多,不同协议的工作方式不同,地址格式也不同。为了解决多重协议的识别问题,我们必须引入一些用于区分的概念并对其初始化。 2)套接字的意思和作用是什么? 套接字提供了对网络连接的一系列封装——虽然你可以自己写,但完全没有必要不是么?它根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源。例如TCP/IP的socket提供三种类型套接字(流式、数据报、原始),分别对应面向连接的服务(例如FTP)、无连接服务(例如NFS)和较底层的连接服务(例如IP或者自定义协议),你可以基于套接字提供的封装比较方便的实现网络连接服务。 在IP层次以上网络通信的基本原理和电话或者电报的基本原理是非常相近的。TCP连接类似电话,UDP连接类似电报。 下面我以一些代码片段(注意是帮助理解的片段,不能编译执行)简单地对其进行类比: fd = socket(AF_INET, SOCK_STREAM, 0); address.sin_family = AF_INET; address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_port = htons(1234); address_len = sizeof(address); //这就是在初始化网络环境,类似于你朋友买了一个电话,同时到电信公司申请了号码,然后登记的分机是1234 bind(fd, (struct sockaddr *)&address, address_len); //好了,这是做了一个bind(绑定),类似于电信公司把电话号码和你朋友家的哪个端口线连上了。 listenfd = listen(fd, 64) while(1){ ....一系列等待客户端的操作,从略 } //这里在服务器端一般会有一个无限循环,服务器会一直等待来自客户端的消息,类似于你朋友一直在等待你的电话。客户端,类似的也有买电话(socket创建)和初始化,我就不写了,预先设定好你要拨打的分机号码是1234 rtval = connect(fd, (struct sockaddr *)&address, address_len); //上面的语句表示开始拨打电话了: //如果你的朋友接了电话,通话建立了(上面语句的返回值rtval不为-1),你就可以讲话: writen(fd, (void *)data, strlen(data)); //对方讲话,你听: len = readline(fd, (void *)data2, 100); //讲完了,挂电话,类似于下面的语句: close(fd); 整体情况大概就是这样,所以可以看到计算机的实现和日常生活是很接近的!希望这可以帮助你理解网络通信。 最后建议阅读TCP/IP详解之卷2(实现),里面很多例子不长但很经典,对于打好基础很有帮助。
⑷ 易语言服务器端跟客户端通讯问题
你好,这个不需要映射,如果你是认真想做服务端和客户端的话,请购买独立ip的vps主机。淘宝上面有大把的。也就40块钱一个月。
VPS主机要求如下:
1,vps必须是独立IP
2,vps必须是windows系统
3,vps推荐购买香港机房的
买好独立vps后,你会获得一个独享的公网IP,再在客户端连接服务端里面填写好IP,再把服务器放到vps上面打开运行,至此,服务端与客户端通信成功。
不需要什么映射端口,徒劳无功
解决问题不容易,回答更不容易,请采纳。
⑸ C语言socket编程怎么实现2个客户端之间通信
两个单独的客户端是没法通信的,必须经过服务器。
服务器和客户端连接过程如下:
客户端:
socket-->connect-->read/write
服务器:
socket-->bind-->listen-->accept-->write/read
若要通讯必须要有服务器,只有在connect和accept建立好连接之后才能真正的通信。
如果你是问编程的流程或者上述函数的意义和用法网络上一大堆。
⑹ 客户端与服务器端的通讯,C++书写步骤。
C++通过socket编程实现服务端与客户端的通讯,代码如下(个人环境下测试正常,如果遇到运行send发送报错,请检查服务器端口是否被占用,调试的时候请先运行服务端程序在运行客服端,一定要加载库函数ws2_32.lib,发送字符时应该多加一个空字符作为结束字符):
服务器端程序:
//Server.cpp:.
#include"winsock2.h"
#pragmacomment(lib,"ws2_32.lib")
#include<iostream>
usingnamespacestd;
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA变量
SOCKETsServer;//服务器套接字
SOCKETsClient;//客户端套接字
SOCKADDR_INaddrServ;;//服务器地址
charbuf[BUF_SIZE];//接收数据缓冲区
charsendBuf[BUF_SIZE];//返回给客户端得数据
intretVal;//返回值
//初始化套结字动态库
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return1;
}
//创建套接字
sServer=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sServer)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//释放套接字资源;
return-1;
}
//服务器套接字地址
addrServ.sin_family=AF_INET;
addrServ.sin_port=htons(4999);
addrServ.sin_addr.s_addr=INADDR_ANY;
//绑定套接字
retVal=bind(sServer,(LPSOCKADDR)&addrServ,sizeof(SOCKADDR_IN));
if(SOCKET_ERROR==retVal)
{
cout<<"bindfailed!"<<endl;
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return-1;
}
//开始监听
retVal=listen(sServer,1);
if(SOCKET_ERROR==retVal)
{
cout<<"listenfailed!"<<endl;
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return-1;
}
//接受客户端请求
sockaddr_inaddrClient;
intaddrClientlen=sizeof(addrClient);
sClient=accept(sServer,(sockaddrFAR*)&addrClient,&addrClientlen);
if(INVALID_SOCKET==sClient)
{
cout<<"acceptfailed!"<<endl;
closesocket(sServer);//关闭套接字
WSACleanup();//释放套接字资源;
return-1;
}
while(true)
{
//接收客户端数据
ZeroMemory(buf,BUF_SIZE);
retVal=recv(sClient,buf,BUF_SIZE,0);
if(SOCKET_ERROR==retVal)
{
cout<<"recvfailed!"<<endl;
closesocket(sServer);//关闭套接字
closesocket(sClient);//关闭套接字
WSACleanup();//释放套接字资源;
return-1;
}
if(buf[0]=='0')
break;
cout<<"客户端发送的数据:"<<buf<<endl;
cout<<"向客户端发送数据:";
cin>>sendBuf;
send(sClient,sendBuf,strlen(sendBuf),0);
}
//退出
closesocket(sServer);//关闭套接字
closesocket(sClient);//关闭套接字
WSACleanup();//释放套接字资源;
return0;
}
客户端程序:
#include"winsock2.h"
#include<iostream>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;
BOOLRecvLine(SOCKETs,char*buf);//读取一行数据
intmain(intargc,char*argv[])
{
constintBUF_SIZE=64;
WSADATAwsd;//WSADATA变量
SOCKETsHost;//服务器套接字
SOCKADDR_INservAddr;//服务器地址
charbuf[BUF_SIZE];//接收数据缓冲区
charbufRecv[BUF_SIZE];
intretVal;//返回值
//初始化套结字动态库
if(WSAStartup(MAKEWORD(2,2),&wsd)!=0)
{
cout<<"WSAStartupfailed!"<<endl;
return-1;
}
//创建套接字
sHost=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(INVALID_SOCKET==sHost)
{
cout<<"socketfailed!"<<endl;
WSACleanup();//释放套接字资源
return-1;
}
//设置服务器地址和端口
servAddr.sin_family=AF_INET;
servAddr.sin_addr.s_addr=inet_addr("127.0.0.1");
servAddr.sin_port=htons((short)4999);
intnServAddlen=sizeof(servAddr);
//连接服务器
retVal=connect(sHost,(LPSOCKADDR)&servAddr,sizeof(servAddr));
if(SOCKET_ERROR==retVal)
{
cout<<"connectfailed!"<<endl;
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源
return-1;
}
while(true)
{
//向服务器发送数据
ZeroMemory(buf,BUF_SIZE);
cout<<"向服务器发送数据:";
cin>>buf;
retVal=send(sHost,buf,strlen(buf),0);
if(SOCKET_ERROR==retVal)
{
cout<<"sendfailed!"<<endl;
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源
return-1;
}
//RecvLine(sHost,bufRecv);
ZeroMemory(bufRecv,BUF_SIZE);
recv(sHost,bufRecv,BUF_SIZE,0);//接收服务器端的数据,只接收5个字符
cout<<endl<<"从服务器接收数据:"<<bufRecv;
cout<<" ";
}
//退出
closesocket(sHost);//关闭套接字
WSACleanup();//释放套接字资源
return0;
}
⑺ 客户和服务器通信编程实现
//用fork的,也可用select
/* server process */
/* include the necessary header files */
#include<ctype.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<stdlib.h>
#include <arpa/inet.h>
#include<stdio.h>
#include<unistd.h>
#define SIZE sizeof(struct sockaddr_in)
int newsockfd;
int main (int argc, char ** argv) {
int sockfd;
char c;
/* set up the transport end point */
if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) == -1) {
perror ("socket call failed");
exit (1);
}
/* initialize the internet socket with a port number of 7000
and the local address,specified as INADDR_ANY */
struct sockaddr_in server;
server.sin_family=AF_INET;
server.sin_addr.s_addr=INADDR_ANY;
server.sin_port = htons(7000);
/* "bind server address to the end point */
if (bind (sockfd, (struct sockaddr *) &server, SIZE) == -1) {
perror ("bind call failed");
exit (1);
}
/* start listening for incoming connections */
if (listen (sockfd, 5) == -1) {
perror ("listen call failed");
exit (1);
}
for (;;) {
/*accept a connection */
if ((newsockfd = accept (sockfd, NULL, NULL)) == -1) {
perror ("accept call failed");
continue;
}
/* spawn a child to deal with the connection */
if (fork () == 0) {
while (recv (newsockfd, &c, 1, 0) > 0) { // could use read
c = toupper (c);
send (newsockfd, &c, 1, 0); // could use write
}
/* when client is no longer sending information
the socket can be closed and the child process
terminated
*/
close (newsockfd);
exit (0);
}
close (newsockfd);
}
}
//客户端可用telnet
⑻ JSP页面是如何在客户端和服务器端执行的
客户端在通过浏览器访问服务器端存放的JSP时,JSP中的java代码、标签等是在服务器端运行的,生成普通的html,最终返回客户端的是这些html,这样解释明白么。
JSP在服务器端是被编译成为servlet的,这些servlet负责提供html的输出,因此说JSP和Servlet一样属于服务器端的技术。但是你从地址栏里输入的可能有jsp后缀,并不表示它就是客户端运行的。
⑼ 用C++ socket怎么实现client与server的多线程通信
一种思想就是在服务器端使用多线程函数,接收到一个客户端请求就开辟一个新的线程来实现客户端与服务器端之间的通信。
具体做法见下面这个例子(在vs2015下编译通过):
//服务器端:
#define_WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include<WinSock2.h>
#include<process.h>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;
enum{PORT=8621};
voidthread_fun(void*p)
{
//通信线程函数
chars[1024];
SOCKETsocka=(SOCKET)p;
char*str="helloclient!";
sockaddr_insa={AF_INET};
intn_Len=sizeof(sa);
send(socka,str,strlen(str),0);
//获取客户端ip地址
getpeername(socka,(sockaddr*)&sa,&n_Len);
cout<<inet_ntoa(sa.sin_addr)<<"-"<<htons(sa.sin_port)<<"登录:"<<endl;
while(true)//循环接收数据
{
inti=recv(socka,s,sizeof(s),0);
if(i<=0)
{
cout<<GetLastError()<<endl;
cout<<inet_ntoa(sa.sin_addr)<<"-"<<htons(sa.sin_port)<<"退出:"<<endl;
break;
}
s[i]=0;
cout<<inet_ntoa(sa.sin_addr)<<"-"<<htons(sa.sin_port)<<"说:"<<s<<endl;
}
}
intmain()
{
WSADATAwd;
WSAStartup(0x0202,&wd);//初始化加载ws2_32.lib
SOCKETsock=socket(AF_INET,SOCK_STREAM,0);//初始化套接字
if(sock==INVALID_SOCKET)
{
cout<<GetLastError()<<endl;
return-1;
}
sockaddr_insa={AF_INET,htons(PORT)};
if(bind(sock,(sockaddr*)&sa,sizeof(sa))<0)//绑定端口
{
cout<<GetLastError()<<endl;
return-1;
}
listen(sock,5);//监听
while(true)
{
SOCKETsocka=accept(sock,0,NULL);//通信套接字
_beginthread(thread_fun,0,(void*)socka);//创建线程
}
return0;
}
//客户端:
#define_WINSOCK_DEPRECATED_NO_WARNINGS
#include<iostream>
#include<WinSock2.h>
#pragmacomment(lib,"ws2_32.lib")
usingnamespacestd;
enum{PORT=8621};
intmain()
{
WSADATAwd;
WSAStartup(0x0202,&wd);//初始化加载ws2_32.lib
SOCKETsock=socket(AF_INET,SOCK_STREAM,0);//初始化套接字
if(sock==INVALID_SOCKET)
{
cout<<GetLastError()<<endl;
return-1;
}
sockaddr_insa={AF_INET,htons(PORT)};//指明地址信息
sa.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
intn_Len=sizeof(sa);
if(SOCKET_ERROR==connect(sock,(sockaddr*)&sa,n_Len))//连接
{
cout<<GetLastError()<<endl;
return-1;
}
chars[1024];
intn=recv(sock,s,sizeof(s),0);//接收数据
if(n>0)
{
s[n]=0;
cout<<s<<endl;
}
while(true)
{
cout<<"请输入要发送的内容:";
cin>>s;
send(sock,s,strlen(s),0);
}
return0;
}
⑽ web客户端与服务器之间的通信的基本过程
(1) 连接 当客户在浏览器上键入或单击一个URL时,客户程序就在网络上搜索定位正确的服务器,并与其连接。
(2) 请求 在连接后,客户程序向服务器发出一个请求,要求服务器向自己发送指定的信息。
(3) 响应 服务器收到请求,就向客户端传回所需要的文件。
(4)关闭 服务器发出数据后,就断开与客户端的连接,以便接受其他客户的连接。