Java客户端与C++服务器端通信
2016-03-27 21:49
411 查看
java客户端代码如下:
创建socket并绑定
C++服务器端代码:
创建socket、绑定端口、监听端口
创建socket并绑定
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.InetSocketAddress; import java.net.Socket; public class JavaClient { public static void main(String [] args) throws InterruptedException, IOException { InetSocketAddress addr = new InetSocketAddress("127.0.0.1", 5678); //创建socket Socket sock = new Socket(); sock.connect(addr);//连接服务器 BufferedReader is = null; PrintWriter os = null; os = new PrintWriter(sock.getOutputStream()); //管道的写工具 is = new BufferedReader(new InputStreamReader(sock.getInputStream())); //管道的读工具 BufferedReader user = new BufferedReader(new InputStreamReader(System.in)); //从控制台读取命令的工具 System.out.print("client say:"); String msg = user.readLine(); while(!msg .equals("bye")) { os.println(msg); os.flush(); String echo = is.readLine(); System.out.println(echo); System.out.print("client say:"); msg = user.readLine(); } os.close(); is.close(); sock.close(); } }
C++服务器端代码:
创建socket、绑定端口、监听端口
#include <winsock2.h> #include <process.h> #pragma comment(lib, "ws2_32.lib") #include <list> std::list<SOCKET> client_list; void thread_client(void * ); int main(int argc, char * argv[]) { WSADATA wsadata; WSAStartup(0x22, &wsadata); unsigned short sPort = argc>1 ? atoi(argv[1]) : 5678; int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockfd == INVALID_SOCKET) { printf("fail to create socket.\n"); return 1; } sockaddr_in saddr; saddr.sin_addr.s_addr = ADDR_ANY; saddr.sin_port = htons(sPort); saddr.sin_family = AF_INET; if(bind(sockfd, (const sockaddr *)(&saddr), sizeof(saddr))) { printf("fail to bind, errno: %d.\n", GetLastError()); DWORD dw = WSAGetLastError(); return 2; } if (listen(sockfd, 5)) { printf("fail to listen.\n"); return 3; } printf("Server is listening at [%d].\n" "Wating for client to connect...\n" , sPort); for (;;) { sockaddr_in caddr; int caddr_len = sizeof(caddr); int client = accept(sockfd, (sockaddr *)&caddr, &caddr_len); unsigned char * pAddr = (unsigned char *)&caddr.sin_addr.s_addr; printf("[%d.%d.%d.%d : %d] coming.\n", pAddr[0], pAddr[1], pAddr[2], pAddr[3], ntohs(caddr.sin_port)); _beginthread(thread_client, 0, (void *)client); client_list.push_back(client); } return 0; } void thread_client(void * args) { SOCKET client = (int)args; sockaddr_in caddr; int caddr_len = sizeof(caddr); getpeername(client, (sockaddr *)&caddr, &caddr_len); unsigned char * pAddr = (unsigned char *)&caddr.sin_addr.s_addr; unsigned short usPort = ntohs(caddr.sin_port); for (;;) { char szMsg [0x1000] = ""; if (0 >= recv(client, szMsg, sizeof(szMsg)-1, 0)) break; char szEcho [0x1000] = ""; sprintf(szEcho, "Server Say: [%d.%d.%d.%d:%d] %s" , pAddr[0], pAddr[1], pAddr[2], pAddr[3] , usPort , szMsg); for (std::list<SOCKET>::iterator it = client_list.begin(); it != client_list.end(); it ++) { send(*it, szEcho, strlen(szEcho), 0); } } }
相关文章推荐
- 2014秋C++第5周项目1參考-见识刚開始学习的人常见错误
- 一个简单的程序教你区分C++中strlen与sizeof
- C++学习日志第三篇
- python 赋值 浅拷贝 深拷贝 与c++ 比较
- 详解MVP矩阵之齐次坐标和ModelMatrix
- 环形缓存区bufferC语言实现
- c++设计模式之原型模式(protoptype)
- C++各数据类型取值范围(备忘)--32位操作系统
- 贪心算法 problem M
- base64编码、解码的C语言实现
- C语言的EOF
- qt c++对象头文件如何相互包含
- 浅谈const限定符——c++
- C++游戏系列1-角色类
- C++项目参考解答:三角形类
- 2015级C++第5周项目 类和对象
- 利用责任链模式模拟加薪请求 C++
- 树莓派瞎玩~6~控制GPIO之C语言
- 笔试真题-计算大位数的乘积
- C语言中main函数的参数