下面用C++基于win32 socket library实现一个socket 服务端:
WORD verWord; WSADATA wsaData; SOCKET svrSock, clientSock; SOCKADDR_IN svrAddr, clientAddr; int err; short port = 2046; int addrLen = sizeof(SOCKADDR); verWord = MAKEWORD(2, 0); if ( (err = WSAStartup(verWord, &wsaData)) != 0) { cout << "startup err" << endl; return 0; } if ( LOBYTE(verWord) != 2 || HIBYTE(verWord) != 0 ) { WSACleanup(); cout << "version err" << endl; return 0; } svrSock = socket(AF_INET, SOCK_STREAM, 0);//SOCK_STREAM stand for tcp, AF_INET used in win svrAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//使用任意IP地址,eg 127.0.0.1,INADDR_ANY may be 0x0x00000000 svrAddr.sin_family = AF_INET; svrAddr.sin_port = htons(port);//htons转换端口 bind(svrSock, (SOCKADDR *)&svrAddr, sizeof(SOCKADDR));//绑定地址&端口供客户端连接 listen(svrSock, 5);//开启服务,准备接受客户端连接,backlog 5表示最大处理连接数 printf("server %d is listening.../n", port); while(true) { char recvBuf[1024]; clientSock = accept(svrSock, (SOCKADDR *)&clientAddr, &addrLen); char *cip = inet_ntoa(clientAddr.sin_addr); printf("accept client connection from %s /n", cip); int bytes; if ( (bytes = recv(clientSock, recvBuf, sizeof(recvBuf), 0)) == SOCKET_ERROR) { cout << "receive error" << endl; exit(-1); } recvBuf[bytes] = '/0'; printf("receive message :%s/n", recvBuf); if (send(clientSock, recvBuf, strlen(recvBuf)+1, 0) == SOCKET_ERROR) { cout << "send error" << endl; exit(-1); } printf("message sended to %s :%s /n", recvBuf, cip); closesocket(clientSock);//关闭客户端socket连接 }
下面使用Flex Gumbo实现一个简单的socket连接客户端:
<fx:Script> <![CDATA[ import mx.events.FlexEvent; [Bindable] private var receivedData :String = ''; private var socket :Socket; protected function sendBtn_clickHandler(event:MouseEvent):void { // TODO Auto-generated method stub socket.connect("127.0.0.1", 2046); } private function socketConnectHandler(e :Event) :void { trace('connected to server'); socket.writeMultiByte(txt.text, "utf-8"); } private function socketDataHandler(e :ProgressEvent) :void { trace("received data from server", socket.connected); receivedData += socket.readMultiByte(socket.bytesAvailable, 'utf-8'); } protected function application1_creationCompleteHandler(event:FlexEvent):void { // TODO Auto-generated method stub socket = new Socket(); socket.addEventListener(Event.CONNECT, socketConnectHandler); socket.addEventListener(ProgressEvent.SOCKET_DATA, socketDataHandler); } ]]> </fx:Script> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <s:TextInput id="txt" text="hi,sban" /> <s:Button label="send" id="sendBtn" click="sendBtn_clickHandler(event)" /> <s:Label text="received from server : {receivedData}" />