昨天我試圖創建一個android應用程序和一個Windows應用程序。C#客戶端 - Java服務器數據讀取速度慢? - 已解決
Android應用 - 發送的炭[]使用WIFI的窗口應用程序的一對。
的Windows應用程序 - C#服務器應用程序,監聽客戶端的數據
不過這兩個程序運作良好,但數據從服務器讀取是有點很慢。
我發送的是這樣的信息。我有一個手柄通過otg連接到我的手機,當我按下按鈕A數據變成這樣。我甚至嘗試在我的android應用程序中放置一個textview,它沒有任何延遲地工作,當我按下按鈕時,我可以看到我的textview中更改的數據集。
所以我認爲問題是在服務器和客戶端之間。這是不可能解決的,因爲它們是2個不同的平臺?我已經嘗試過這種東西,Xamarin,它運行良好。但由於某些具體原因,我不想在這一點上使用Xamarin。
比方說,我按下按鈕A,B,C,d這樣的數據是這樣的,我清楚地可以看到它在Android應用TextView的,當然,我會在我的服務器程序看到這個數據,但只有在大約10-30秒的延遲之後。
我的手機是Nexus 5.這是使用兩種不同平臺的結果嗎?
服務器代碼: -
private void startBtn_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(StartServer));
thread.Start();
}
void StartServer()
{
Log("Running");
TcpClient client = new TcpClient();
TcpListener server = new TcpListener(IPAddress.Any, 8888);
server.Start();
client = server.AcceptTcpClient();
Log("Client connected");
byte[] byteArray = new byte[8];
NetworkStream inOpt = client.GetStream();
while (true)
{
inOpt.Read(byteArray, 0, 8);
Log(ASCIIEncoding.);
}
}
void Log(string msg)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(Log), new object[] {msg});
return;
}
logBox.Text = "";
logBox.Text += msg + Environment.NewLine;
}
Android客戶端代碼: -
char[] keys = {'0', '0', '0', '0', '0', '0', '0', '0'};
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList gameControllerDeviceIds = new ArrayList();
int[] deviceIds = InputDevice.getDeviceIds();
for (int deviceId : deviceIds) {
InputDevice dev = InputDevice.getDevice(deviceId);
int sources = dev.getSources();
// Verify that the device has gamepad buttons, control sticks, or both.
if (((sources & InputDevice.SOURCE_GAMEPAD) == InputDevice.SOURCE_GAMEPAD)
|| ((sources & InputDevice.SOURCE_JOYSTICK)
== InputDevice.SOURCE_JOYSTICK)) {
// This device is a game controller. Store its device ID.
if (!gameControllerDeviceIds.contains(deviceId)) {
gameControllerDeviceIds.add(deviceId);
Log.d("yolol", String.valueOf(deviceId));
}
}
}
//Log.d("yolol", InputDevice.getDevice(7).getName());
new CheckUsageStartup().execute();
Log.d("sss", Arrays.toString(keys));
textView = (TextView) findViewById(R.id.textView);
}
byte[] toByteArray(String[] strong){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
for(int i = 0; i < strong.length; i++)
{
try{
dos.writeUTF(strong[i]);
}
catch (IOException e){
}
}
return baos.toByteArray();
}
class CheckUsageStartup extends AsyncTask<Void, Integer, String> {
String TAG = getClass().getSimpleName();
protected void onPreExecute() {
Log.d(TAG + " PreExceute", "On pre Exceute......");
}
protected String doInBackground(Void... arg0) {
Log.d(TAG + " DoINBackGround", "On doInBackground...");
try {
Socket socket = new Socket("192.168.1.8", 8888);
OutputStream out = socket.getOutputStream();
Writer writer = new OutputStreamWriter(out, "UTF-8");
while(true){
writer.write(keys, 0, 8);
writer.flush();
}
} catch (IOException e) {
System.out.println(e.getMessage());
return "Instant";
}
}
protected void onProgressUpdate(Integer... a) {
Log.d(TAG + " onProgressUpdate", "You are in progress update ... " + a[0]);
}
protected void onPostExecute(String result) {
Log.d(TAG + " onPostExecute", "" + result);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
int deviceId = event.getDeviceId();
if (deviceId != -1) {
switch(keyCode){
case KeyEvent.KEYCODE_BUTTON_1:
keys[0] = '1';
Log.d("u", "po");
break;
case KeyEvent.KEYCODE_BUTTON_2:
keys[1] = '1';
break;
case KeyEvent.KEYCODE_BUTTON_3:
keys[2] = '1';
break;
case KeyEvent.KEYCODE_BUTTON_4:
keys[3] = '1';
break;
case KeyEvent.KEYCODE_DPAD_UP:
keys[4] = '1';
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
keys[5] = '1';
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
keys[6] = '1';
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
keys[7] = '1';
break;
}
textView.setText(Arrays.toString(keys));
return true;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
int deviceId = event.getDeviceId();
if (deviceId != -1) {
switch(keyCode){
case KeyEvent.KEYCODE_BUTTON_1:
keys[0] = '0';
break;
case KeyEvent.KEYCODE_BUTTON_2:
keys[1] = '0';
break;
case KeyEvent.KEYCODE_BUTTON_3:
keys[2] = '0';
break;
case KeyEvent.KEYCODE_BUTTON_4:
keys[3] = '0';
break;
case KeyEvent.KEYCODE_DPAD_UP:
keys[4] = '0';
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
keys[5] = '0';
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
keys[6] = '0';
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
keys[7] = '0';
break;
}
textView.setText(Arrays.toString(keys));
return true;
}
return super.onKeyUp(keyCode, event);
}
下面的代碼。請告訴我可能的解決方案。它編碼是否做了這麼多的延遲,也許呢?