Android与PC的socket通信

来源:互联网 发布:理财软件对比分析 编辑:程序博客网 时间:2024/04/30 13:39

/////////////////////////////////////////////////////////////Android server

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketException;
import java.util.Enumeration;

import android.app.Activity;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.util.Log;

public class ActivityServer extends Activity {
    /** Called when the activity is first created. */

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        Thread desktopServerThread = new Thread(new TCPDesktopServer());
        desktopServerThread.start();
    }
   
    public class TCPDesktopServer implements Runnable {
        //public static final String SERVERIP="192.168.1.100";
        public static final int SERVERPORT=51706;
        @Override
        public void run() {
           try{
            Log.d("TCP","服务器:正在连接..."+getLocalIpAddress());
               ServerSocket serverSocket = new ServerSocket(SERVERPORT);
               //SocketAddress sa = serverSocket.getLocalSocketAddress();
       
              
               while(true){
                  Socket client = serverSocket.accept();
                  Log.d("TCP","服务器:正在接收...");
                 
                  InetAddress addr = serverSocket.getInetAddress();
                  Log.d("TCP","Connection from==>" + addr.getHostName()
                    + "/t" + addr.getHostAddress());
                  try{
                   Log.d("TCP","__________1");
                      BufferedReader in = new BufferedReader(new
                        InputStreamReader(client.getInputStream()));
                      Log.d("TCP","__________2");
                      //String str = in.readLine();
                      char data[] = new char[1024];
                      int len = in.read(data);
                      char dataRe[] = new char[len];
                      System.arraycopy(data, 0, dataRe, 0, len);
                      String str = new String(dataRe);
                      Log.d("TCP","服务器:接收到:'" + str + "'");
                    
                  }catch(Exception e){
                   Log.d("TCP","服务器:出错!");
                      e.printStackTrace();
                  }
                  finally{
                      client.close();
                      System.out.println("服务器:关闭。");
                  }
               }
           }catch(Exception e){
               System.out.println("服务器:出错!");
               e.printStackTrace();
           }
          
        }
    }
   
    public String getLocalMacAddress() { 
        WifiManager wifi = (WifiManager) getSystemService(WIFI_SERVICE); 
        WifiInfo info = wifi.getConnectionInfo(); 
        return info.getMacAddress(); 
    } 
   
    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()) { 
                        return inetAddress.getHostAddress().toString(); 
                    } 
                } 
            } 
        } catch (SocketException ex) { 
            Log.e("WifiPreference IpAddress", ex.toString()); 
        } 
        return null; 
    } 
}

/////////////////////////////////////////////////////////////////////////////////////////////Android Client

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class ActivityClient extends Activity implements OnClickListener{
    /** Called when the activity is first created. */
 //private final int TIMER_INVALIDATE = 10001;
 private final int TIMER_INVALIDATE = 51706;
 private String SOCKET_IP = "192.168.50.132";
 //private String SOCKET_IP = "192.168.50.247";
 private int SOCKET_PORT = 51706;
 private Button mBtnConnet;
 private Button mBtnClose;
 private Button mBtnSend;
 Socket socket = null;
 private String mStrShow;
 private TextView mText;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mText = (TextView)findViewById(R.id.text_show);
        mBtnConnet = (Button)findViewById(R.id.btn_connect);
        mBtnClose = (Button)findViewById(R.id.btn_close);
        mBtnSend = (Button)findViewById(R.id.btn_send);
        mBtnConnet.setOnClickListener(this);
        mBtnClose.setOnClickListener(this);
        mBtnSend.setOnClickListener(this);
    }
   
    public void connect(){
     try {
      InetAddress serverAddr = InetAddress.getByName(SOCKET_IP);//TCPServer.SERVERIP
         Log.d("TCP", "C: Connecting...");
         socket = new Socket(serverAddr, SOCKET_PORT);
         
         
//         PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
//         out.println(message);
//         out.flush();
//         receive();
     } catch(Exception e) {
         Log.e("TCP", "S: Error", e);
     } finally {
        
     }
    }

    public void receive(){
     new Thread(){
   public void run(){
    try{
     while(!socket.isClosed()){
      
      InputStream is = socket.getInputStream();

      byte data[] = new byte[1024];
      int n = is.read(data);
      if(n > 0){
       String val = new String(data);
       mStrShow += val;
       Log.d("TCP","receive mStrShow="+mStrShow);
       Message message = new Message();// 生成消息,并赋予ID值
       message.what = TIMER_INVALIDATE;
       myHandler.sendMessage(message);// 投递消息
      }
      
      sleep(300);
     }
    }
    catch(Exception e){

    }
   }
  }.start();
    }
    private void close(){
     try {
      Log.d("TCP","socket close");
      socket.close();
  } catch (IOException e) {
   // TODO Auto-generated catch block
    Log.e("TCP", "S: Error", e);
  }
    }
   
    private void send(){
     try{
      String message = "AndroidRes,Where is my Pig (Android)?";
      Log.d("TCP", "C: Sending: '" + message + "'");
      mStrShow = "C: Sending: '" + message + "'";
      mText.setText(mStrShow);
     
      PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
      out.println(message);
      //out.flush();
    
     }catch(Exception e){
      e.printStackTrace();
     }
    }
    Handler myHandler = new Handler() {
  public void handleMessage(Message msg) {
   switch (msg.what) {
   case TIMER_INVALIDATE:
    mText.setText(mStrShow);
    break;
   }
   super.handleMessage(msg);
  }
 };
 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  if(v.getId() == R.id.btn_connect){
   connect();
  }
  else if(v.getId() == R.id.btn_close){
   close();
  }
  else if(v.getId() == R.id.btn_send){
   send();
  }
  
 }
}

///////////////////////////////////////////////////////////////////////////////////////////PC server           C++

#include <windows.h>
#include <winsock.h>
#include <iostream>
#pragma   comment( lib,"Ws2_32.lib")
#define DEFAULT_PORT      51706
SOCKET m_Listening;

typedef struct
{
    int firstArgu;
    long secArgu;
}myType,* pMyType;

int Receive(SOCKET fd,char *szText,int len)
{
 int cnt, rc;
 cnt=len;
 while(cnt>0)
 {
  rc=recv(fd,szText,cnt,0);
  if(rc==SOCKET_ERROR)
  {
   return -1;
  }
  if(rc==0)
   return len-cnt;
  szText+=rc;
  cnt-=rc;
 }
 return len;
}

 

int Send(SOCKET fd,char *szText,int len)
{
  int cnt, rc;
  cnt=len;
  while(cnt>0)
  {
   rc=send(fd,szText,cnt,0);
   if(rc==SOCKET_ERROR)
   {
    return -1;
   }
   if(rc==0)
    return len-cnt;
   szText+=rc;
   cnt-=rc;
  }
  return len;
}
DWORD WINAPI ListenThread(LPVOID lpparam)
{
 char szBuf[MAX_PATH];
 int cc = 0;
  //初始化
  memset(szBuf,0,MAX_PATH);
 SOCKET   ConnectSocket=((pMyType)lpparam)->firstArgu;
 printf("开始接收 socketid=%d\n",ConnectSocket);
 while(1)
  {
    int n =recv(ConnectSocket,szBuf,MAX_PATH,0);
    printf("接收:%s\n",szBuf);
    //向客户端发送回应数据
    if(cc % 4 == 0){
   Send(ConnectSocket,szBuf,n);
    }
    cc++;
  }

  return 0;
}

int main(int argc, char* argv[])
{
  WSADATA wsaData;
  if(WSAStartup(0x0110,&wsaData)) //调用Windows Sockets DLL
  {
   puts("Winsock无法初始化!");
   return -1;
  }
  DWORD dwThreadID = 0;
  sockaddr_in local;
  //DWORD dwThreadID = 0;
  local.sin_family=AF_INET;
  //设置的端口为DEFAULT_PORT。
  local.sin_port=htons(DEFAULT_PORT);
 
  //local.sin_port=htons(DEFAULT_PORT);
  //IP地址设置成INADDR_ANY,让系统自动获取本机的IP地址。
  local.sin_addr.S_un.S_addr=INADDR_ANY;//inet_addr("127.0.0.1");
  //初始化Socket
  m_Listening=socket(AF_INET,SOCK_STREAM,0);
  if(m_Listening == INVALID_SOCKET)
  {
   puts("创建Winsock实例失败!");
   return -1;
  }
  if(bind(m_Listening,(LPSOCKADDR)&local,sizeof(local)) == SOCKET_ERROR )
  {
   closesocket(m_Listening);
   puts("绑定端口失败!");
   return -1;
  }
  if(listen(m_Listening,40) == SOCKET_ERROR)
  {
   puts("监听端口失败!");
   return -1;
  }
  puts("启动成功");
  char szBuf[MAX_PATH];
  //初始化
  memset(szBuf,0,MAX_PATH);
  int ct = 0;
  while(1)
  {
    SOCKET ConnectSocket;
    sockaddr_in    ClientAddr;
    int                  nLen = sizeof(sockaddr);
    //阻塞直到有客户端连接,不然多浪费CPU资源。
    ConnectSocket = accept(m_Listening,(sockaddr*)&ClientAddr,&nLen);
    //都到客户端的IP地址。
    char *pAddrname = inet_ntoa(ClientAddr.sin_addr);
   printf("登录:%s socketid=%d\n",pAddrname,ConnectSocket);

    myType param;
   param.firstArgu=ConnectSocket;
         param.secArgu=100000000;
  ::CreateThread(NULL,0,ListenThread,&param,0,NULL);
  }
}

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////PC Client c++

#include <stdio.h>
#include <Winsock2.h>   
 
#pragma comment(lib,"ws2_32.lib")   
 
#define  MAX_BUF_SIZE 1024   
#define  PORT_NUMBER 51706

int client()
{
 WSADATA wSaData;   
    WORD dwSockVersion = MAKEWORD(2,2);   
    if (0 != WSAStartup(dwSockVersion,&wSaData)) //?????
    {
        printf("Arrange Version Failure");
        return -1;
    }
 
    SOCKET nSocket;   
    nSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //??TCP socket   
    if (INVALID_SOCKET == nSocket)   
    {   
        printf("invalid socket");   
        WSACleanup();   
        return -1;   
    }   
 
    sockaddr_in sa;   
    sa.sin_family = AF_INET;   
    sa.sin_addr.s_addr = inet_addr("192.168.50.132");   
 //sa.sin_addr.s_addr = inet_addr("192.168.50.247");   
    sa.sin_port = htons(51706);
    if ( 0 != connect( nSocket,( const SOCKADDR * )&sa, sizeof(sa) ) )
        return -1;
 
    char buf[MAX_BUF_SIZE] = {0};   
    char tmp[MAX_BUF_SIZE] = {0};
    strcpy(tmp,"this is Client!");
 
    int nSend = send(nSocket, tmp, (int)strlen(tmp), 0);
 printf("nSend=%d/n",nSend);
    int nRecv = 0;
    nRecv = recv(nSocket, buf, MAX_BUF_SIZE, 0);
 printf("nRecv=%d/n",nRecv);
    if (nRecv > 0)
    {
        printf("%s/n",buf);
    }
    closesocket(nSocket);
    WSACleanup();
}


int server()
{

 return 0;
}

int main(int argc, char* argv[])
{
 client();

 return 0;
}


 源码下载http://download.csdn.net/detail/notepaper/3911879

原创粉丝点击