Java中的Socket编程发送和接收字节数组
Socket Programming in Java to send and receive byte array
我是 android 的新手,我对套接字编程有疑问。
class ClientAsycTask extends AsyncTask<String,Void,String>{
ProgressDialog progress;
@Override
protected void onPreExecute() {
progress = new ProgressDialog(MainActivity.this);
progress.setMessage("Connection Server Please wait");
progress.setIndeterminate(true);
progress.show();
}
@Override
protected String doInBackground(String... params) {
String result = null;
Socket socket = new Socket();
String host = "systemteq.gotdns.com";
Integer port = 4999;
DataOutputStream s_out = null;
BufferedReader s_in = null;
try{
socket.connect(new InetSocketAddress(host, port));
s_out = new DataOutputStream( socket.getOutputStream());
s_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00};
s_out.write(messages);
String response;
while((response = s_in.readLine())!=null){
result += response;
}
//result = "Successfully"+s_in.read();//s_in.readLine();
socket.close();
}catch (Exception e){
Toast.makeText(MainActivity.this,"systemteq.gotdns.com:4999 not connected",Toast.LENGTH_SHORT).show();
}
return result;
}
@Override
protected void onPostExecute(String s) {
if(progress.isShowing()){
progress.dismiss();
}
Toast.makeText(MainActivity.this,"Connected "+s,Toast.LENGTH_SHORT).show();
tv.setText(s);
}
}
上面的代码向服务器发送了一个十六进制代码,服务器用一些十六进制代码进行响应,比如说 10 01 20 10 00。[五个字节]。
但是当我 运行 以上代码进度对话框永远不会关闭。解决后我发现 s_in.readLine() 在读取服务器响应时遇到一些问题。
我浏览了很多链接,但未能成功解决此问题。请帮我破解这个。
更新:-
使用DataInputStream后:-
s_in = new DataInputStream(socket.getInputStream());
byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00};
s_out.write(messages);
String response;
System.out.println("START");
result = s_in.readUTF();
它仍然不占用响应字节。虽然请求成功。
更新 2
byte m = s_in.readByte();
result = Byte.toString(m);
现在正在获取字节值,但我应该获取 5 个字节,而不是只获取一个字节的 5 个字节。请帮我解决这个问题
如果您正在等待二进制数据,请不要使用 InputStreamReader
,请尝试使用 DataInputStream
。
readLine()
等待'\n'、'\r'、“\r\n”或reader 结束。
更新:如果您知道确切的字节数,请将它们读入数组。
byte[] buf = new byte[5];
s_in.read(buf);
我是 android 的新手,我对套接字编程有疑问。
class ClientAsycTask extends AsyncTask<String,Void,String>{
ProgressDialog progress;
@Override
protected void onPreExecute() {
progress = new ProgressDialog(MainActivity.this);
progress.setMessage("Connection Server Please wait");
progress.setIndeterminate(true);
progress.show();
}
@Override
protected String doInBackground(String... params) {
String result = null;
Socket socket = new Socket();
String host = "systemteq.gotdns.com";
Integer port = 4999;
DataOutputStream s_out = null;
BufferedReader s_in = null;
try{
socket.connect(new InetSocketAddress(host, port));
s_out = new DataOutputStream( socket.getOutputStream());
s_in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00};
s_out.write(messages);
String response;
while((response = s_in.readLine())!=null){
result += response;
}
//result = "Successfully"+s_in.read();//s_in.readLine();
socket.close();
}catch (Exception e){
Toast.makeText(MainActivity.this,"systemteq.gotdns.com:4999 not connected",Toast.LENGTH_SHORT).show();
}
return result;
}
@Override
protected void onPostExecute(String s) {
if(progress.isShowing()){
progress.dismiss();
}
Toast.makeText(MainActivity.this,"Connected "+s,Toast.LENGTH_SHORT).show();
tv.setText(s);
}
}
上面的代码向服务器发送了一个十六进制代码,服务器用一些十六进制代码进行响应,比如说 10 01 20 10 00。[五个字节]。
但是当我 运行 以上代码进度对话框永远不会关闭。解决后我发现 s_in.readLine() 在读取服务器响应时遇到一些问题。
我浏览了很多链接,但未能成功解决此问题。请帮我破解这个。
更新:-
使用DataInputStream后:-
s_in = new DataInputStream(socket.getInputStream());
byte[] messages = new byte[]{0x10,0x01,0x03,0x00,0x00};
s_out.write(messages);
String response;
System.out.println("START");
result = s_in.readUTF();
它仍然不占用响应字节。虽然请求成功。
更新 2
byte m = s_in.readByte();
result = Byte.toString(m);
现在正在获取字节值,但我应该获取 5 个字节,而不是只获取一个字节的 5 个字节。请帮我解决这个问题
如果您正在等待二进制数据,请不要使用 InputStreamReader
,请尝试使用 DataInputStream
。
readLine()
等待'\n'、'\r'、“\r\n”或reader 结束。
更新:如果您知道确切的字节数,请将它们读入数组。
byte[] buf = new byte[5];
s_in.read(buf);