java 客户端代码 创建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
绑定端口
监听端口
// ConsoleServer.cpp : 定义控制台应用程序的入口点。 // #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); } } }
通信结果显示,在eclipse里面