在wifi局域网下,手机可以和电脑通过socket通信。手机做服务端,电脑做客户端;也可以反过来,电脑做服务端,手机做客户端。
下面介绍的是手机作为服务端,电脑使用MFC编程作为客户端,原理是,手机建立一个ServerSocket,并获取自己的ip地址和端口port;然后电脑通过socket连接手机的ip:port。
代码下载地址:http://download.csdn.net/detail/menghnhhuan/4050488
手机建立socketServer代码
[html] private ServerSocket serverSocket = null;
private RunnablemcreateRunnable = new Runnable()
{
public void run()
{
try {
serverSocket = new ServerSocket(0);//系统分配端口
getLocalIpAddress();//获得手机的ip地址
//方法用于等待客服连接
mSocketServer = serverSocket.accept();
//接受客服端数据BufferedReader对象
mBufferedReaderServer = new BufferedReader(new InputStreamReader(mSocketServer.getInputStream()));
//给客服端发送数据
mPrintWriterServer = new PrintWriter(mSocketServer.getOutputStream(),true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
private ServerSocket serverSocket = null;
private Runnable mcreateRunnable = new Runnable()
{
public void run()
{
try {
serverSocket = new ServerSocket(0);//系统分配端口
getLocalIpAddress();//获得手机的ip地址
//方法用于等待客服连接
mSocketServer = serverSocket.accept();
//接受客服端数据BufferedReader对象
mBufferedReaderServer = new BufferedReader(new InputStreamReader(mSocketServer.getInputStream()));
//给客服端发送数据
mPrintWriterServer = new PrintWriter(mSocketServer.getOutputStream(),true);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
手机上获取的ip地址代码
[html] public String getLocalIpAddress()
{
try {
for (Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
{
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr=intf.getInetAddresses();enumIpAddr.hasMoreElements();)
{
InetAddress inetAddress = enumIpAddr.nextElement();
//if (!inetAddress.isLoopbackAddress())
{
//if(inetAddress.isSiteLocalAddress())
{
String ip = "请连接IP:"+inetAddress.getHostAddress()+":"
+ serverSocket.getLocalPort()+ "\n";
}
}
}
}
}
catch (SocketException ex) {
ex.printStackTrace();}
}
public String getLocalIpAddress()
{
try {
for (Enumeration<NetworkInterface> en=NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();)
{
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr=intf.getInetAddresses();enumIpAddr.hasMoreElements();)
{
InetAddress inetAddress = enumIpAddr.nextElement();
//if (!inetAddress.isLoopbackAddress())
{
//if(inetAddress.isSiteLocalAddress())
{
String ip = "请连接IP:"+inetAddress.getHostAddress()+":"
+ serverSocket.getLocalPort()+ "\n";
}
}
}
}
}
catch (SocketException ex) {
ex.printStackTrace(); }
}
电脑上使用的是MFC编程,socket代码如下
[html] DWORD clientThreadID;
SOCKETclientSock;
charserver_address[50] = {0};
charrecv_message_client[256] = {0};
structsockaddr_in server_ip;
BOOL clientThreadRun = false;
//client
BOOL InItClientSock()
{
//Define Variable
WORD wVersionrequested;
WSADATA wsaData;
wVersionrequested = MAKEWORD(2,0);
//Start Sock
int err = WSAStartup(wVersionrequested,&wsaData);
if (err == -1)
{
MessageBox(0,"WSAStartup err", "error",MB_OK);
return FALSE;
}
return TRUE;
}
BOOL ConnectSock()
{
SOCKET clientSockConnect;
u_short port;
//Ini Sock
clientSock = socket(AF_INET,SOCK_STREAM,0);
if (ServerSock < 0)
{
MessageBox(0,"scoker err",
"err",MB_OK);
return FALSE;
}
char *strPort = strstr(server_address, ":");
if( (strPort!=NULL) && (strlen(strPort)>2) )
{
port = atoi(strPort+1);
if(port==0)
{
MessageBox(0, "IP端口不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);
return FALSE;
}
memset(strPort, 0, sizeof(strPort));
}
else
{
MessageBox(0, "IP地址不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);
return FALSE;
}
//Connect
server_ip.sin_family = AF_INET;
server_ip.sin_port = ((port&0xff00)>>8)|((port&0x00ff)<<8);
server_ip.sin_addr.S_un.S_addr = inet_addr(server_address);
clientSockConnect = connect(clientSock,(struct sockaddr*)&server_ip,sizeof(server_ip));
if (clientSockConnect!=0)
{
CString temp;
temp.Format("系统拒绝连接,可能是输入IP地址或端口不对:\n%s:%d", server_address, server_ip.sin_port);
SetDlgItemText( FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);
MessageBox(0, "系统拒绝连接,可能是输入IP地址或端口不对 ", "提示", MB_OK);
return FALSE;
}
return TRUE;
}
DWORD WINAPI clientThreadFunc(LPVOID threadNum)
{
int length;
CString temp;
if(!InItClientSock())
return 0;
if(!ConnectSock())
return 0;
//等待连接的时候,连接可能被取消。
if(clientThreadRun)
SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "已经连接上!");
else
{
SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "请启动服务!");
return 0;
}
//send(NewSock,(char*)&FALG,sizeof(FALG)+1,MSG_OOB);
while(clientThreadRun)
{
if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
{
//MessageBox(0, recv_message, "接收到的信息", MB_OK);
temp.Format("接收到的信息:\n%s",recv_message_client);
SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);
analyseCommand(recv_message_client);
memset(recv_message_client, 0, sizeof(recv_message_client));
}
temp.Format("接收到的信息:\n%s",recv_message_client);
}
return 0;
}
DWORD clientThreadID;
SOCKETclientSock;
charserver_address[50] = {0};
charrecv_message_client[256] = {0};
structsockaddr_in server_ip;
BOOL clientThreadRun = false;
//client
BOOL InItClientSock()
{
//Define Variable
WORD wVersionrequested;
WSADATA wsaData;
wVersionrequested = MAKEWORD(2,0);
//Start Sock
int err = WSAStartup(wVersionrequested,&wsaData);
if (err == -1)
{
MessageBox(0,"WSAStartup err", "error",MB_OK);
return FALSE;
}
return TRUE;
}
BOOL ConnectSock()
{
SOCKET clientSockConnect;
u_short port;
//Ini Sock
clientSock = socket(AF_INET,SOCK_STREAM,0);
if (ServerSock < 0)
{
MessageBox(0,"scoker err",
"err",MB_OK);
return FALSE;
}
char *strPort = strstr(server_address, ":");
if( (strPort!=NULL) && (strlen(strPort)>2) )
{
port = atoi(strPort+1);
if(port==0)
{
MessageBox(0, "IP端口不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);
return FALSE;
}
memset(strPort, 0, sizeof(strPort));
}
else
{
MessageBox(0, "IP地址不对, 参考例子:192.168.12.134:8981", "提示", MB_OK);
return FALSE;
}
//Connect
server_ip.sin_family = AF_INET;
server_ip.sin_port = ((port&0xff00)>>8)|((port&0x00ff)<<8);
server_ip.sin_addr.S_un.S_addr = inet_addr(server_address);
clientSockConnect = connect(clientSock,(struct sockaddr*)&server_ip,sizeof(server_ip));
if (clientSockConnect!=0)
{
CString temp;
temp.Format("系统拒绝连接,可能是输入IP地址或端口不对:\n%s:%d", server_address, server_ip.sin_port);
SetDlgItemText( FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);
MessageBox(0, "系统拒绝连接,可能是输入IP地址或端口不对 ", "提示", MB_OK);
return FALSE;
}
return TRUE;
}
DWORD WINAPI clientThreadFunc(LPVOID threadNum)
{
int length;
CString temp;
if(!InItClientSock())
return 0;
if(!ConnectSock())
return 0;
//等待连接的时候,连接可能被取消。
if(clientThreadRun)
SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "已经连接上!");
else
{
SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, "请启动服务!");
return 0;
}
//send(NewSock,(char*)&FALG,sizeof(FALG)+1,MSG_OOB);
while(clientThreadRun)
{
if( (length = recv(clientSock,(char*)recv_message_client,sizeof(recv_message_client),0))>0)
{
//MessageBox(0, recv_message, "接收到的信息", MB_OK);
temp.Format("接收到的信息:\n%s",recv_message_client);
SetDlgItemText(FindWindow(NULL, WINDOWNHANDLERNAME), IDC_STATIC_IP, temp);
analyseCommand(recv_message_client);
memset(recv_message_client, 0, sizeof(recv_message_client));
}
temp.Format("接收到的信息:\n%s",recv_message_client);
}
return 0;
}
摘自 menghnhhuan的专栏