c++与java通过socket实现网络通信的测试
这个小测试仅仅是为了证明一点:掌握了原理后,语言不再是问题,c++和java也可以实现“通婚”。
C++服务器端代码:
#include<winsock2.h>
#include<iostream>
using namespace std;
int main(){
SOCKET ServerSocket; //服务器
string client_ip ;//客户对应ip
int port=9090;//端口号
cout<<"C++服务器初始化!....."<<endl;
//初始化winsock
WSADATA wsaD; //WSADATA结构被用来保存函数WSAStartup返回的 Windows Sockets初始化信息。
WSAStartup(MAKEWORD(1,1),&wsaD); //初始化Windows Sockets DLL
//一、创建监听套接字 ,TCP
ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//af:协议地址家族。创建TCP/UDP套接字时该参数为AF_INET。
//type:协议的套接字类型。有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM 3种类型
//protocol:协议。对于SOCK_STREAM套接字类型,该字段为IPPROTO_TCP或为0,
// 对于SOCK_DGRAM套接字类型,该字段为IPPROTO_UDP或为0
// 二、绑定主机地址和监听套接字
struct sockaddr_in server_addr; //主机地址
cout<<"主机地址"<<server_addr.sin_family<<endl;
server_addr.sin_family = AF_INET; //协议地址家族
cout<<"协议地址家族"<<server_addr.sin_family<<endl;
server_addr.sin_port = htons(port); //指定端口
#include<iostream>
using namespace std;
int main(){
SOCKET ServerSocket; //服务器
string client_ip ;//客户对应ip
int port=9090;//端口号
cout<<"C++服务器初始化!....."<<endl;
//初始化winsock
WSADATA wsaD; //WSADATA结构被用来保存函数WSAStartup返回的 Windows Sockets初始化信息。
WSAStartup(MAKEWORD(1,1),&wsaD); //初始化Windows Sockets DLL
//一、创建监听套接字 ,TCP
ServerSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
//af:协议地址家族。创建TCP/UDP套接字时该参数为AF_INET。
//type:协议的套接字类型。有SOCK_STREAM、SOCK_DGRAM和SOCK_RAM 3种类型
//protocol:协议。对于SOCK_STREAM套接字类型,该字段为IPPROTO_TCP或为0,
// 对于SOCK_DGRAM套接字类型,该字段为IPPROTO_UDP或为0
// 二、绑定主机地址和监听套接字
struct sockaddr_in server_addr; //主机地址
cout<<"主机地址"<<server_addr.sin_family<<endl;
server_addr.sin_family = AF_INET; //协议地址家族
cout<<"协议地址家族"<<server_addr.sin_family<<endl;
server_addr.sin_port = htons(port); //指定端口
cout<<"服务器端口:"<<port<<endl;
cout<<"server_addr.sin_port:"<<server_addr.sin_port<<endl;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// cout<<"server_addr.sin_addr.s_addr: "<<server_addr.sin_addr.s_addr<<endl;
bind(ServerSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
//三、启动监听
listen(ServerSocket,5);
while(true){
//四、连接
struct sockaddr_in c_addr; //客户地址
int addr_len =sizeof(c_addr);
SOCKET clientsock = accept(ServerSocket,(struct sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字
client_ip = inet_ntoa(c_addr.sin_addr);
cout<<"one java client is coming...";
//五、收发数据
//具体通信处理
}
//六、关闭
//system("PAUSE");
return 0;
}
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
// cout<<"server_addr.sin_addr.s_addr: "<<server_addr.sin_addr.s_addr<<endl;
bind(ServerSocket,(struct sockaddr *)&server_addr,sizeof(server_addr));
//三、启动监听
listen(ServerSocket,5);
while(true){
//四、连接
struct sockaddr_in c_addr; //客户地址
int addr_len =sizeof(c_addr);
SOCKET clientsock = accept(ServerSocket,(struct sockaddr*)&c_addr,&addr_len); //通过监听套接字创建连接套接字
client_ip = inet_ntoa(c_addr.sin_addr);
cout<<"one java client is coming...";
//五、收发数据
//具体通信处理
}
//六、关闭
//system("PAUSE");
return 0;
}
注意:要将socket动态库libws2_32.a添加到linker: C:/Dev-Cpp/lib/libws2_32.a 中,具体添加方法网上有。如果需要可以给我留言。
java客户端代码:
写道
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception{
Socket clientSocket = new Socket("192.168.1.103",9090);
//收发数据,具体通信处理
//...............................
import java.net.*;
public class TCPClient {
public static void main(String[] args) throws Exception{
Socket clientSocket = new Socket("192.168.1.103",9090);
//收发数据,具体通信处理
//...............................
clientSocket.close();
}
}
效果:
至此,c++和java的“Socket联姻”就完成了,接下来要怎么进行工作,你说了算!