[英]C# client-Java Server data reading is slow?
昨天我尝试创建一个Android应用程序和Windows应用程序。
Android应用程序 -使用WIFI将几个char []发送到Windows应用程序。
Windows应用程序 -C#服务器应用程序,侦听客户端数据
但是,这两个程序都能正常工作,但是从服务器读取的数据有点慢。
我正在发送这样的数据000000000 。 我有一个通过otg连接到手机的游戏板 ,当我按下Button时,数据变为10000000 。 我什至尝试将textview放在我的android应用程序中,它没有任何延迟,并且当我按下按钮时,我可以在textview中看到更改的数据集。
所以我认为问题出在服务器和客户端之间。 因为它们是2个不同的平台,所以不可能解决这个问题吗? 我已经用Xamarin尝试过这种方法,它效果很好。 但出于某些特定原因,我目前不希望使用Xamarin 。
假设我按下了按钮A,B,C,D,所以数据是这样的11110000 ,我可以在android应用程序TextView中清楚地看到它,当然我会在服务器程序中看到此数据,但是要经过很长的延迟,大约10到30秒。
我的手机是Nexus5。是使用两个不同平台的结果吗?
服务器代码:
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);
}
这是代码。 请告诉我可能的解决方案。 编码会延迟很多吗?
我想到了。
这是从早期版本更新文本框的代码,
void Log(string msg)
{
if (InvokeRequired)
{
this.Invoke(new Action<string>(Log), new object[] {msg});
return;
}
logBox.Text = "";
logBox.Text += msg + Environment.NewLine;
}
我不知道是什么原因引起的,但是从下面的代码更新文本框后,它现在可以正常工作了。
Invoke((MethodInvoker)delegate {
logBox.Text = ASCIIEncoding.UTF8.GetString(byteArray, 0, 8);
});
似乎使用第一种方法会产生一些不必要的延迟。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.