socket的示例代码

package com.example.car.car;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.logging.SocketHandler;

public class MainActivity extends AppCompatActivity  {
    Button btnUP,btnCenter,btnDown,btnLeft,btnRight,btnPutdown,btnRiseup,btnHold,btnRelease,btnConn;
    EditText etIP;
    Toast tst;
    ButtonListener b = new ButtonListener();
    char buffer[] = new char[5];
    private static StringBuffer mConsoleStr = new StringBuffer();
    private Socket mSocket;
    private boolean isStartRecieveMsg;
    private SocketHandler mHandler;
    protected BufferedReader mReader;//BufferedWriter 用于推送消息
    protected BufferedWriter mWriter;//BufferedReader 用于接收消息



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.land_main);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
        btnUP=(Button)findViewById(R.id.btnUP);
        btnDown=(Button)findViewById(R.id.btnDown);
        btnLeft=(Button)findViewById(R.id.btnLeft);
        btnCenter=(Button)findViewById(R.id.btnCenter);
        btnRight=(Button)findViewById(R.id.btnRight);
        btnHold=(Button)findViewById(R.id.btnHold);
        btnRelease=(Button)findViewById(R.id.btnRelease);
        btnPutdown=(Button)findViewById(R.id.btnPutDown);
        btnRiseup=(Button)findViewById(R.id.btnRiseUp);
        btnConn=(Button)findViewById(R.id.btnConnect);
        etIP=(EditText)findViewById(R.id.etIP);

        btnUP.setOnClickListener(b);
        btnUP.setOnTouchListener(b);
        btnDown.setOnClickListener(b);
        btnDown.setOnTouchListener(b);
        btnLeft.setOnClickListener(b);
        btnLeft.setOnTouchListener(b);
        btnRight.setOnClickListener(b);
        btnRight.setOnTouchListener(b);
        btnCenter.setOnClickListener(b);
        btnPutdown.setOnClickListener(b);
        btnHold.setOnClickListener(b);
        btnRelease.setOnClickListener(b);
        btnRiseup.setOnClickListener(b);
        btnConn.setOnClickListener(b);
    }
    private void initSocket() {
        //新建一个线程,用于初始化socket和检测是否有接收到新的消息
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                String ip = etIP.getText().toString();//IP
                int port = 9001;//Socket
                try {
                    isStartRecieveMsg = true;
                    mSocket = new Socket(ip, port);
                    mReader = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),"UTF-8"));
                    mWriter = new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream(),"UTF-8"));
                    while(isStartRecieveMsg) {
                        if(mReader.ready()) {
              /*读取一行字符串,读取的内容来自于客户机
              reader.readLine()方法是一个阻塞方法,
              从调用这个方法开始,该线程会一直处于阻塞状态,
              直到接收到新的消息,代码才会往下走*/
                            String data = mReader.readLine();
                            //handler发送消息,在handleMessage()方法中接收
                            //mHandler.obtainMessage(0, data).sendToTarget();
                        }
                        Thread.sleep(200);
                    }
                    mWriter.close();
                    mReader.close();
                    mSocket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
        thread.start();
    }
    /**
     * 发送
     */
    private void send() {
        new AsyncTask<String, Integer, String>() {
            @Override
            protected String doInBackground(String... params) {
                sendMsg();
                return null;
            }
        }.execute();
    }
    /**
     * 发送消息
     */
    protected void sendMsg() {
        OutputStream output =null;
        try {


            mWriter.write(buffer);
            mWriter.flush();
            //output=mSocket.getOutputStream();
            //output.write(buff);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onBackPressed() {
        super.onBackPressed();
        isStartRecieveMsg = false;
    }
    class ButtonListener implements View.OnClickListener, View.OnTouchListener {
        Toast ttt;
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btnCenter:
                    buffer[2]=0x00;
                    send();
                    break;
                case R.id.btnPutDown:
                    buffer[2]=0x11;
                    send();
                    break;
                case R.id.btnRiseUp:
                    buffer[2]=0x12;
                    send();
                    break;
                case R.id.btnHold:
                    buffer[2]=0x13;
                    send();
                    break;
                case R.id.btnRelease:
                    buffer[2]=0x14;
                    send();
                    break;
                case R.id.btnConnect:
                    if(!isStartRecieveMsg) {
                        initSocket();
                        buffer[0]=0x33;
                        buffer[1]=0x00;
                        buffer[2]=0x00;
                        buffer[3]=0x00;
                        buffer[4]=0x33;
                    }

                    break;

                default:
                    break;
            }
        }
        public boolean onTouch(View v, MotionEvent event) {
            switch (v.getId()) {
                case R.id.btnUP:
                    if(event.getAction()==MotionEvent.ACTION_UP) {
                        //tst = Toast.makeText(MainActivity.this, "up", Toast.LENGTH_SHORT);
                        //tst.show();
                        buffer[2]=0x00;
                        send();
                    }
                    if(event.getAction()==MotionEvent.ACTION_DOWN) {
                        //tst = Toast.makeText(MainActivity.this, "down", Toast.LENGTH_SHORT);
                        //tst.show();
                        buffer[2]=0x01;
                        send();
                    }


                    break;
                case R.id.btnDown:
                    if(event.getAction()==MotionEvent.ACTION_UP) {
                        //tst = Toast.makeText(MainActivity.this, "up", Toast.LENGTH_SHORT);
                        //tst.show();
                        buffer[2]=0x00;
                        send();
                    }
                    if(event.getAction()==MotionEvent.ACTION_DOWN) {
                        //tst = Toast.makeText(MainActivity.this, "down", Toast.LENGTH_SHORT);
                        //st.show();
                        buffer[2]=0x02;
                        send();
                    }
                    break;
                case R.id.btnLeft:
                    if(event.getAction()==MotionEvent.ACTION_UP) {
                        //tst = Toast.makeText(MainActivity.this, "up", Toast.LENGTH_SHORT);
                        //tst.show();
                        buffer[2]=0x00;
                        send();
                    }
                    if(event.getAction()==MotionEvent.ACTION_DOWN) {
                        //st = Toast.makeText(MainActivity.this, "down", Toast.LENGTH_SHORT);
                        //tst.show();
                        buffer[2]=0x03;
                        send();
                    }
                    break;
                case R.id.btnRight:
                    if(event.getAction()==MotionEvent.ACTION_UP) {
                        //tst = Toast.makeText(MainActivity.this, "up", Toast.LENGTH_SHORT);
                        //tst.show();
                        buffer[2]=0x00;
                        send();
                    }
                    if(event.getAction()==MotionEvent.ACTION_DOWN) {
                        //tst = Toast.makeText(MainActivity.this, "down", Toast.LENGTH_SHORT);
                        //.show();
                        buffer[2]=0x04;
                        send();
                    }
                    break;


                default:
                    break;
            }
            return false;
        }
    }
}

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <time.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <wiringPi.h>
#define BUFSIZE 512
#define MOTOR_GO_FORWARD   digitalWrite(1,HIGH);digitalWrite(4,LOW); digitalWrite(5,HIGH);digitalWrite(6,LOW)
#define MOTOR_GO_BACK    digitalWrite(1,LOW); digitalWrite(4,HIGH);digitalWrite(5,LOW); digitalWrite(6,HIGH)
#define MOTOR_GO_RIGHT    digitalWrite(1,HIGH);digitalWrite(4,LOW); digitalWrite(5,LOW); digitalWrite(6,LOW)
#define MOTOR_GO_LEFT    digitalWrite(1,LOW); digitalWrite(4,LOW); digitalWrite(5,HIGH);digitalWrite(6,LOW)
#define MOTOR_GO_STOP    digitalWrite(1, LOW);digitalWrite(4,LOW); digitalWrite(5, LOW);digitalWrite(6,LOW)
pthread_t ppid,ppid1,ppid2,ppid3;
int range,range1,range2,range3;
typedef struct CLIENT {
 int fd;
 struct sockaddr_in addr;
}CLIENT;

void microseconds_sleep(unsigned long uSec){
 struct timeval tv;
 int err;
 tv.tv_sec = uSec / 1000000;
 tv.tv_usec = uSec % 1000000;
 do{
  err = select(0,NULL ,NULL , NULL , &tv);
  
 }while((err<0) && (errno == EINTR));
}
                  //putup
void Duoji_CTL(void)     //rang:0-100 map to PWM high puls with 1-2ms PWM_H=range+100
{
 int i,j;
 int PWM_H=0;                        //define pwm high time;
 range += 10;
 
 if(range > 60)
  range = 0;
 while(1)
 {
  
  PWM_H=(int)((2*range+43)*10); 
  digitalWrite(10, HIGH);
  microseconds_sleep(PWM_H);
  
  digitalWrite(10, LOW);
  microseconds_sleep(19800-PWM_H);
  
 }
 
}
//putdown
void Duoji_CTR(void)     //rang:0-100 map to PWM high puls with 1-2ms PWM_H=range+100
{
 int i,j;
 int PWM_H=0;                        //define pwm high time;
 range1 += 10;
 printf("%d\n",range1);
 if(range1 > 90)
  range1 = 0;
 while(1)
 {
  PWM_H=(int)((2*range1+43)*10); 
  digitalWrite(11, HIGH);
  microseconds_sleep(PWM_H);
  digitalWrite(11, LOW);
  microseconds_sleep(19800-PWM_H);
  
 }
 
}

//hold
void Duoji_CTHOLD(void)     //rang:0-100 map to PWM high puls with 1-2ms PWM_H=range+100
{
 int i,j;
 int PWM_H=0;                        //define pwm high time;
 range2 += 10;
 printf("%d\n",range2);
 if(range2 > 90)
  range2 = 0;
 while(1)
 {
  PWM_H=(int)((2*range2+43)*10); 
  digitalWrite(26, HIGH);
  microseconds_sleep(PWM_H);
  digitalWrite(26, LOW);
  microseconds_sleep(19800-PWM_H);
  
 }
 
}

//realse
void Duoji_CTREALSE(void)     //rang:0-100 map to PWM high puls with 1-2ms PWM_H=range+100
{
 int i,j;
 int PWM_H=0;                        //define pwm high time;
 range2 -= 10;
 if(range2 < 0)
  range2 = 90;
 while(1)
 {
  PWM_H=(int)((2*range2+43)*10); 
  digitalWrite(26, HIGH);
  microseconds_sleep(PWM_H);
  digitalWrite(26, LOW);
  microseconds_sleep(19800-PWM_H);
  
 }
 
}


int main(int argc, char *argv[])
{
    int sockfd;
    int listenfd;
    int connectfd;
    
    int ret;
    int maxfd=-1;
    struct timeval tv;
    struct sockaddr_in server_addr;
    struct sockaddr_in client_addr;
    socklen_t len;
    int portnumber;
    char buf[BUFSIZE]={0xff,0x00,0x00,0x00,0xff};
    int z,i,maxi = -1;
    int k;
    fd_set rset,allset;
    
    CLIENT client[FD_SETSIZE];
    
     range=0;
     range1=0;
     range2=0;
     range3=0;
 
    /*RPI*/
    wiringPiSetup();
    /*WiringPi GPIO*/
    pinMode (1, OUTPUT); //IN1
    pinMode (4, OUTPUT); //IN2
    pinMode (5, OUTPUT); //IN3
    pinMode (6, OUTPUT); //IN4
    pinMode (3, OUTPUT); //beed
    pinMode (10, OUTPUT); //beed
    pinMode (11, OUTPUT); //beed
    pinMode (26, OUTPUT); //beed
  
 
 /*Init output*/
 digitalWrite(1,HIGH);
 digitalWrite(4,HIGH);
 digitalWrite(5,HIGH);
 digitalWrite(6,HIGH);
 
 digitalWrite(1,HIGH);
    if(argc != 2)
    {
        printf("Please add portnumber!");
        exit(1);
    }
    if((portnumber = atoi(argv[1]))<0)
    {
        printf("Enter Error!");
        exit(1);
    }

    if((listenfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
    {
        printf("Socket Error!");
        exit(1);
    }

    memset(&server_addr, 0, sizeof server_addr);
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(portnumber);

    if((bind(listenfd, (struct sockaddr *)(&server_addr), sizeof server_addr)) == -1)
    {
        printf("Bind Error!");
        exit(1);
    }
    if(listen(listenfd, 128) == -1)
    {
        printf("Listen Error!");
        exit(1);
    }
    for(i=0;i<FD_SETSIZE;i++)
    {
 client[i].fd = -1;
    }
    FD_ZERO(&allset);
    FD_SET(listenfd, &allset);
    maxfd = listenfd;
    printf("waiting for the client's request...\n");
    while (1)
    {
 rset = allset;
 tv.tv_sec = 0;      //wait 1u second
        tv.tv_usec = 1;
   
        ret = select(maxfd + 1, &rset, NULL, NULL, &tv);
   
 if(ret == 0)
     continue;
 else if(ret < 0)
 {
     printf("select failed!");
            break;
 }
 else
 {
     if(FD_ISSET(listenfd,&rset)) // new connection
     {
  len = sizeof (struct sockaddr_in);
  if((connectfd = accept(listenfd,(struct sockaddr*)(&client_addr),&len)) == -1)
  {
      printf("accept() error");
      continue;
                }
  for(i=0;i<FD_SETSIZE;i++)
  {
      if(client[i].fd < 0)
      {
          client[i].fd = connectfd;
   client[i].addr = client_addr;
   printf("Yout got a connection from %s\n",inet_ntoa(client[i].addr.sin_addr));
   break;
      }
  }
  if(i == FD_SETSIZE)
      printf("Overfly connections");
  FD_SET(connectfd,&allset);
  if(connectfd > maxfd)
      maxfd = connectfd;
  if(i > maxi)
      maxi = i;
     }
     else
     {
  for(i=0;i<=maxi;i++)
  {
      if((sockfd = client[i].fd)<0)
          continue;
                    if(FD_ISSET(sockfd,&rset))
      {
   bzero(buf,BUFSIZE + 1);
   if((z = read(sockfd,buf,sizeof buf)) >0)
   {
                    buf[z] = '\0';
                     //printf("num = %d received data:%s\n",z,buf);
       /*
                            for(k=0;k<z;k++)
           printf("buf[%d]=%x\n",k,buf[k]);
       */
       if(z == 5)
       {
    if(buf[1] == 0x00)
    {
             switch(buf[2])
                {
     
     case 0x01:MOTOR_GO_FORWARD; printf("forward\n");break;
     case 0x11:pthread_create(&ppid , NULL , (void *)(& Duoji_CTR) ,NULL);  printf("downup\n");break;
     case 0x12:pthread_create(&ppid1 , NULL , (void *)(& Duoji_CTL) ,NULL);  printf("putup\n");break;
     
     case 0x13:pthread_create(&ppid2 , NULL , (void *)(& Duoji_CTHOLD) ,NULL);  printf("hold\n");break;
     case 0x14:pthread_create(&ppid3 , NULL , (void *)(& Duoji_CTREALSE) ,NULL);  printf("realse\n");break;
     
     case 0x02:MOTOR_GO_BACK;    printf("back\n");break;                  
     case 0x03:MOTOR_GO_LEFT;    printf("left\n");break;
     case 0x04:MOTOR_GO_RIGHT;   printf("right\n");break;
     case 0x00:MOTOR_GO_STOP;    printf("stop\n");break;
     default: break;
        }
        digitalWrite(3, HIGH);
    }
    else
    {
        digitalWrite(3, LOW);
        MOTOR_GO_STOP;
    }
       }
       else if(z == 6)
       {
    if(buf[2] == 0x00)
    {
        switch(buf[3])
        {
     case 0x01:MOTOR_GO_FORWARD; printf("forward\n");break;
     case 0x02:MOTOR_GO_BACK;    printf("back\n");break;       
     case 0x03:MOTOR_GO_LEFT;    printf("left\n");break;
     case 0x04:MOTOR_GO_RIGHT;   printf("right\n");break;
     case 0x00:MOTOR_GO_STOP;    printf("stop\n");break;
     default: break;
        }
        digitalWrite(3, HIGH);
    }
    else
    {
        digitalWrite(3, LOW);
        MOTOR_GO_STOP;
    }
       }
       else
       {
    digitalWrite(3, LOW);
    MOTOR_GO_STOP;
       }
    
                        }
          else
          {
              printf("disconnected by client!");
                     close(sockfd);
                     FD_CLR(sockfd,&allset);
                     client[i].fd = -1;
          }
             }
         }
            }
        }
    }
    close(listenfd);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值