TCPクライアントが予想通りではなくサーバー通信へのTCPクライアント -- java フィールド と android フィールド と python フィールド と c フィールド と sockets フィールド 関連 問題

TCP Client to Server communication not as expected












0
vote

問題

日本語

特定のボタンごとにバイトを送信するコントローラを作成しようとしています。

テストのために私はPythonでクライアントを作成しましたCのサーバと共にサーバと一緒に作成しました。サーバー私はボタンをリリースしました(0x2)。そしてサーバーはこの罰金を受け取ります。

今、私はAndroidでより具体的にはJavaで同じことをやろうとしています。 Androidアプリのボタンを押すと0x1が送信され、サーバーはそれを受信しますが、そのボタンをリリースした後、サーバーはクライアントを切断した後0x2バイトのみを受信します。

OfCouse Pythonで私のクライアントを使用するときと同じ結果を望みます。

Pythonのクライアント:

<事前> <コード> class MainWindow(QWidget, Ui_Form): def __init__(self, TCP_IP, TCP_PORT): super(MainWindow, self).__init__() """ TCP related """ self.TCP_IP = TCP_IP self.TCP_PORT = TCP_PORT self.sock = None """ Ui related """ self.setupUi(self) self.setWindowTitle("RC Car Controller") self.setWindowIcon(QIcon("6269-200.png")) """ Initialize the socket """ self.initialize_socket() def initialize_socket(self): try: self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP self.sock.connect((self.TCP_IP, self.TCP_PORT)) except Exception as e: print(e) @pyqtSlot(name="") def on_btnFullForward_pressed(self): self.send_data(b'x01') @pyqtSlot(name="") def on_btnFullForward_released(self): self.send_data(b'x02') def send_data(self, data): try: self.sock.send(data) except Exception as e: print(e)

C内のサーバーの例:

<事前> <コード> unsigned char buffer[1]; struct sockaddr_in serverAddr, clientAddr; int tcpSocket, slen, n, conn; void ConnectionSocket(char* ip){ /*Create TCP socket*/ tcpSocket = socket(AF_INET, SOCK_STREAM, 0); if (tcpSocket < 0) { perror("ERROR opening socket"); exit(1); } memset(&serverAddr, '0', sizeof(serverAddr)); memset(buffer, '0', sizeof(buffer)); /*Configure settings in address struct*/ serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(7891); serverAddr.sin_addr.s_addr = inet_addr(ip); if (bind(tcpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) { perror("ERROR on binding"); } if(listen(tcpSocket, 10) == -1){ printf("Failed to listen "); } slen = sizeof(clientAddr); conn = accept(tcpSocket,(struct sockaddr *)&clientAddr, &slen); // Blocking! } void loop(){ while(1){ if (conn < 0) { perror("ERROR on accept"); exit(1); } n = read(conn, buffer, 1); if (n == NULL){ printf("Client has disconnected!, Trying to reconnect.. "); emergency_stop(); reconnect_on_failed(); }else{ printf("Received packet from %s:%d ", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port)); control_car(buffer); handle_pins(); } } } void reconnect_on_failed(){ slen = sizeof(clientAddr); conn = accept(tcpSocket,(struct sockaddr *)&clientAddr, &slen); // Blocking! printf("Client has reconnected! "); }

Javaのクライアント(Android):

<事前> <コード> package com.example.gianni.rccar; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MotionEvent; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; import java.io.IOException; import java.io.OutputStream; import java.net.Socket; public class MainActivity extends AppCompatActivity { ImageButton FullFoward; ImageButton Forward; ImageButton Backward; ImageButton Left; ImageButton Right; EditText Ip; Button Set; WebView Cam; public int port = 7891; public Socket socket; final byte[][] data = new byte[1][1]; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FullFoward = (ImageButton) findViewById(R.id.buttonFullFoward); Forward = (ImageButton) findViewById(R.id.buttonForward); Backward = (ImageButton) findViewById(R.id.buttonBackward); Left = (ImageButton) findViewById(R.id.buttonLeft); Right = (ImageButton) findViewById(R.id.buttonRight); Ip = (EditText) findViewById(R.id.editTextIp); Set = (Button) findViewById(R.id.buttonSet); Cam = (WebView) findViewById(R.id.Camera); FullFoward.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: data[0] = new byte[]{0x1}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: data[0] = new byte[]{0x2}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event } return false; } }); Forward.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: data[0] = new byte[]{0x3}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: data[0] = new byte[]{0x4}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event } return false; } }); Backward.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: data[0] = new byte[]{0x5}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: data[0] = new byte[]{0x6}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event } return false; } }); Right.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: data[0] = new byte[]{0x7}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: data[0] = new byte[]{0x8}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event } return false; } }); Left.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: data[0] = new byte[]{0x9}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event case MotionEvent.ACTION_UP: data[0] = new byte[]{0x10}; new Thread(new myTask2(data[0])).start(); return true; // if you want to handle the touch event } return false; } }); Set.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new myTask(Ip.getText().toString())).start(); Cam.loadUrl("http://" + Ip.getText().toString() + ":9090/stream/video.mjpeg"); } }); Cam.setWebViewClient(new WebViewClient(){ @Override public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { String message = "Camera Connection failed, is the server online? Please reload."; Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG); toast.show(); Cam.loadUrl("about:blank"); super.onReceivedError(view, request, error); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.reload) { String message = "Reloading.."; Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT); toast.show(); Cam.loadUrl("http://" + Ip.getText().toString() + ":9090/stream/video.mjpeg"); } return super.onOptionsItemSelected(item); } private class myTask implements Runnable { String address; myTask(String address) { this.address = address; } @Override public void run() { try { socket = new Socket(this.address, port); } catch (IOException e) { e.printStackTrace(); } } } private class myTask2 implements Runnable { byte[] data; myTask2(byte[] bytes) { this.data = bytes; } @Override public void run() { try { OutputStream out = socket.getOutputStream(); out.write(this.data); } catch (IOException e) { e.printStackTrace(); } } } }
英語

I'm trying to make a controller that sends a byte for each specific button.

For testing I have created a Client in Python along with a Server in C. The result is as expected, if I press a button it sends 0x1 for example until I release the button, because then it sends another byte to tell the server I released the button (0x2). And the server receives this fine.

Now I'm trying to do the same thing in Java, more specific with Android. When I press a button in the Android App it sends 0x1, and the server receives that, but after releasing the button the server only receives the 0x2 byte after disconnecting the client.

Ofcourse I want the same outcome as when using my Client in Python.

Client in Python:

class MainWindow(QWidget, Ui_Form):     def __init__(self, TCP_IP, TCP_PORT):         super(MainWindow, self).__init__()         """ TCP related """         self.TCP_IP = TCP_IP         self.TCP_PORT = TCP_PORT         self.sock = None          """ Ui related """         self.setupUi(self)         self.setWindowTitle("RC Car Controller")         self.setWindowIcon(QIcon("6269-200.png"))          """ Initialize the socket """         self.initialize_socket()      def initialize_socket(self):         try:             self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # TCP             self.sock.connect((self.TCP_IP, self.TCP_PORT))          except Exception as e:             print(e)      @pyqtSlot(name="")     def on_btnFullForward_pressed(self):         self.send_data(b'x01')      @pyqtSlot(name="")     def on_btnFullForward_released(self):         self.send_data(b'x02')      def send_data(self, data):         try:             self.sock.send(data)         except Exception as e:             print(e) 

Example of my Server in C:

unsigned char buffer[1]; struct sockaddr_in serverAddr, clientAddr; int tcpSocket, slen, n, conn;  void ConnectionSocket(char* ip){      /*Create TCP socket*/     tcpSocket = socket(AF_INET, SOCK_STREAM, 0);      if (tcpSocket < 0) {         perror("ERROR opening socket");         exit(1);     }      memset(&serverAddr, '0', sizeof(serverAddr));     memset(buffer, '0', sizeof(buffer));      /*Configure settings in address struct*/     serverAddr.sin_family = AF_INET;     serverAddr.sin_port = htons(7891);     serverAddr.sin_addr.s_addr = inet_addr(ip);      if (bind(tcpSocket, (struct sockaddr *) &serverAddr, sizeof(serverAddr)) < 0) {         perror("ERROR on binding");     }      if(listen(tcpSocket, 10) == -1){         printf("Failed to listen ");     }      slen = sizeof(clientAddr);     conn = accept(tcpSocket,(struct sockaddr *)&clientAddr, &slen); // Blocking! }  void loop(){     while(1){         if (conn < 0) {             perror("ERROR on accept");             exit(1);         }          n = read(conn, buffer, 1);          if (n == NULL){             printf("Client has disconnected!, Trying to reconnect.. ");             emergency_stop();             reconnect_on_failed();         }else{             printf("Received packet from %s:%d ", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port));             control_car(buffer);             handle_pins();         }     } }  void reconnect_on_failed(){     slen = sizeof(clientAddr);     conn = accept(tcpSocket,(struct sockaddr *)&clientAddr, &slen); // Blocking!     printf("Client has reconnected! "); } 

Client in Java (Android):

package com.example.gianni.rccar; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.MotionEvent; import android.view.View; import android.view.Menu; import android.view.MenuItem; import android.webkit.WebResourceError; import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.Button; import android.widget.EditText; import android.widget.ImageButton; import android.widget.Toast; import java.io.IOException; import java.io.OutputStream; import java.net.Socket;   public class MainActivity extends AppCompatActivity {     ImageButton FullFoward;     ImageButton Forward;     ImageButton Backward;     ImageButton Left;     ImageButton Right;     EditText Ip;     Button Set;     WebView Cam;      public int port = 7891;     public Socket socket;     final byte[][] data = new byte[1][1];       @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);         setSupportActionBar(toolbar);          FullFoward = (ImageButton) findViewById(R.id.buttonFullFoward);         Forward = (ImageButton) findViewById(R.id.buttonForward);         Backward = (ImageButton) findViewById(R.id.buttonBackward);         Left = (ImageButton) findViewById(R.id.buttonLeft);         Right = (ImageButton) findViewById(R.id.buttonRight);         Ip = (EditText) findViewById(R.id.editTextIp);         Set = (Button) findViewById(R.id.buttonSet);         Cam = (WebView) findViewById(R.id.Camera);          FullFoward.setOnTouchListener(new View.OnTouchListener() {             @Override             public boolean onTouch(View v, MotionEvent event) {                 switch (event.getAction()) {                     case MotionEvent.ACTION_DOWN:                         data[0] = new byte[]{0x1};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                     case MotionEvent.ACTION_UP:                         data[0] = new byte[]{0x2};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                 }                 return false;             }         });          Forward.setOnTouchListener(new View.OnTouchListener() {             @Override             public boolean onTouch(View v, MotionEvent event) {                 switch (event.getAction()) {                     case MotionEvent.ACTION_DOWN:                         data[0] = new byte[]{0x3};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                     case MotionEvent.ACTION_UP:                         data[0] = new byte[]{0x4};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                 }                 return false;             }         });          Backward.setOnTouchListener(new View.OnTouchListener() {             @Override             public boolean onTouch(View v, MotionEvent event) {                 switch (event.getAction()) {                     case MotionEvent.ACTION_DOWN:                         data[0] = new byte[]{0x5};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                     case MotionEvent.ACTION_UP:                         data[0] = new byte[]{0x6};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                 }                 return false;             }         });          Right.setOnTouchListener(new View.OnTouchListener() {             @Override             public boolean onTouch(View v, MotionEvent event) {                 switch (event.getAction()) {                     case MotionEvent.ACTION_DOWN:                         data[0] = new byte[]{0x7};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                     case MotionEvent.ACTION_UP:                         data[0] = new byte[]{0x8};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                 }                 return false;             }         });          Left.setOnTouchListener(new View.OnTouchListener() {             @Override             public boolean onTouch(View v, MotionEvent event) {                 switch (event.getAction()) {                     case MotionEvent.ACTION_DOWN:                         data[0] = new byte[]{0x9};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                     case MotionEvent.ACTION_UP:                         data[0] = new byte[]{0x10};                         new Thread(new myTask2(data[0])).start();                         return true; // if you want to handle the touch event                 }                 return false;             }         });          Set.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 new Thread(new myTask(Ip.getText().toString())).start();                 Cam.loadUrl("http://" + Ip.getText().toString() + ":9090/stream/video.mjpeg");             }         });          Cam.setWebViewClient(new WebViewClient(){             @Override             public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {                 String message = "Camera Connection failed, is the server online? Please reload.";                 Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG);                 toast.show();                 Cam.loadUrl("about:blank");                 super.onReceivedError(view, request, error);             }         });      }      @Override     public boolean onCreateOptionsMenu(Menu menu) {         // Inflate the menu; this adds items to the action bar if it is present.         getMenuInflater().inflate(R.menu.menu_main, menu);         return true;     }      @Override     public boolean onOptionsItemSelected(MenuItem item) {         // Handle action bar item clicks here. The action bar will         // automatically handle clicks on the Home/Up button, so long         // as you specify a parent activity in AndroidManifest.xml.         int id = item.getItemId();          //noinspection SimplifiableIfStatement         if (id == R.id.reload) {             String message = "Reloading..";             Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT);             toast.show();             Cam.loadUrl("http://" + Ip.getText().toString() + ":9090/stream/video.mjpeg");         }         return super.onOptionsItemSelected(item);     }      private class myTask implements Runnable {         String address;          myTask(String address) {             this.address = address;         }          @Override         public void run() {             try {                 socket = new Socket(this.address, port);             } catch (IOException e) {                 e.printStackTrace();             }         }     }      private class myTask2 implements Runnable {         byte[] data;          myTask2(byte[] bytes) {             this.data = bytes;         }          @Override         public void run() {             try {                 OutputStream out = socket.getOutputStream();                 out.write(this.data);             } catch (IOException e) {                 e.printStackTrace();             }         }     } } 
</div
              
         
         

回答リスト


関連する質問

3  AS3 FTPプログラミングとソケットとByteArrayクラス  ( As3 ftp programming and the socket and bytearray classes ) 
紹介されている件名は、Nerdier Harry Potterのタイトルのように聞こえています。 AS3のSocketクラスを使用して、Flex Builder 3で航空アプリとしてエクスポートするための単純なFTPプログラムを書くことを試みています。サーバ...

27  同じオープンソケットを介した非同期マルチディレクタサーバクライアント通信?  ( Asynchronous multi direction server client communication over the same open sock ) 
私はクライアントがWindows Mobile 6デバイス上にあるクライアントサーバーアプリがあり、C ++で書かれており、サーバーはフルウィンドウに入ってC#で書かれています。 もともと、クライアントからサーバーにメッセージを送信するだけで、サーバーはメッ...

6  タイムアウト期間を迂回するには、すぐにソケットを閉じるにはどうすればよいですか。  ( How can i make a socket close immediately bypassing the timeout period ) 
Javaでは、ソケットを閉じると、もう何もしませんが、実際にはタイムアウト期間の後にTCP接続を閉じます。 私は何千ものソケットを使う必要があります、そして私は彼らを閉じた直後に彼らが閉じたいのですが、私の時間と私のリソースを浪費するタイムアウト期間の後では...

10  DelphiでAsyncソケットプログラミングを行う慣用の方法は何ですか?  ( Whats the idiomatic way to do async socket programming in delphi ) 
Delphiでネットワークコードを書く通常の方法は何ですかWindowsスタイルの重複非同期ソケット入出力? これはこの質問についての私の事前の研究です: Indy コンポーネントは完全に同期しています。一方、SCKTCompユニットはWSAASYNCS...

164  z / ONのC ++でC Socket APIを使用する方法  ( How to use the c socket api in c on z os ) 
z / OS上のC ++でC ++で正しく機能するようになる問題が発生しました。 sys/socket.h を含めていますが、 AF_INET が定義されていないことを伝えます。 私は明白なものを欠いているか、z / OSにいることに関連していることです...

0  私のTCPクライアントがIPアドレスを持つサーバーに接続しているが、「localhost」で動作するときは、例外を取得しています。  ( I am getting an exception when my tcp client connects to the server with ip addr ) 
私は単純なC#TCPクライアントとサーバープログラムを書いています。サーバーは最終的には別のマシンにありますが、今は同じマシンでテストしています。 IPアドレスを使用してTCPClientを作成すると、例外エラーが発生しています。「各ソケットアドレスの使用方法...

7  ネットワークケーブルを抜いているときにソケットに何が起こりますか?  ( What happens to sockets when i unplug a network cable ) 
ソケットを使って互いに話す3つのアプリケーションを持っています。彼らはすべて自分のマシンに住んでいますが、それらは機械を共有することもできます。今私はそれらのうちの2つとそれ自身の機械の3番目のものを持っています。私は私のコミュニケーションの弾丸を証明しようと...

6  ソケットはどのようにJVMで実装されていますか?  ( How are sockets implemented in jvm ) 
私は知っており、ソケットがJava仮想マシンにどのように実装されているか。 ネイティブライブラリが含まれていますか? とif、Cライブラリ? このトピックに関する情報はどこで見つかりますか? オフィスJavaチュートリアルはそこでは私を助けません。 いく...

2  PythonソケットプログラミングとISO OSIモデル  ( Python socket programming and iso osi model ) 
私はPCから他のPCへのパケットを送信しています。 Python Socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM ) を使用しています。パケットを受信する順序を大事にする必要がありますか? トラ...

25  基本的なJavaサーバーを作成する方法[閉まっている]  ( How to create a basic java server ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有