【发布时间】:2018-09-02 11:37:33
【问题描述】:
背景故事: 我创建了一个可以与我的工作服务器连接的条形码扫描应用程序。 Barcode 应用程序功能完美,但是,我没有使用套接字连接到服务器的经验。因此,为了不弄乱 Barcode 应用程序中的任何代码,我复制了一个套接字连接教程并对其进行了编辑。一旦我可以获取测试代码来完成连接并来回发送数据,我将在 Barcode 应用程序中实现它。
问题: 当我单击显示“连接到服务器”的按钮时,我得到了这个:
03-23 11:55:52.174 6438-6459/com.example.vipin.client I/Client: Waiting for message from server...
下面粘贴的是代码。出于安全原因,我删除了 IP 地址和端口。
package com.example.vipin.client;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Client extends AppCompatActivity implements View.OnClickListener {
public static final String TAG = Client.class.getSimpleName();
public static final int SERVERPORT = 0000;
public static final String SERVER_IP = "000.000.0.0";
ClientThread clientThread;
Thread thread;
TextView messageTv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
messageTv = (TextView) findViewById(R.id.messageTv);
}
public void updateMessage(final String message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
messageTv.append(message + "\n");
}
});
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.connect_server) {
messageTv.setText("");
clientThread = new ClientThread();
thread = new Thread(clientThread);
thread.start();
return;
}
if (view.getId() == R.id.send_data) {
clientThread.sendMessage("Hello from Client");
Log.i(TAG, "Sending message to server...");
}
}
class ClientThread implements Runnable {
private Socket socket;
private BufferedReader input;
@Override
public void run() {
try {
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
while (!Thread.currentThread().isInterrupted()) {
Log.i(TAG, "Waiting for message from server...");
this.input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message = input.readLine();
Log.i(TAG, "Message received from the server : " + message);
if (null == message || "Disconnect".contentEquals(message)) {
Thread.interrupted();
message = "Server Disconnected.";
updateMessage(getTime() + " | Server : " + message);
break;
}
updateMessage(getTime() + " | Server : " + message);
}
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
}
void sendMessage(String message) {
try {
if (null != socket) {
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.println(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
String getTime() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
return sdf.format(new Date());
}
@Override
protected void onDestroy() {
super.onDestroy();
if (null != clientThread) {
clientThread.sendMessage("Disconnect");
clientThread = null;
}
}
}
按钮点击事件的日志在这里https://pastebin.com/6wbvLj6w
【问题讨论】:
-
Waiting for message from server...。那有什么问题呢? -
它什么都不做。它只是在那条消息上。
-
没有。不在那个消息上。它尝试使用 readLine() 读取一行。那么服务器发送一个吗?
-
据我所知不是。那么我应该删除该部分吗?
-
客户端和服务器不通信没有多大意义。他们应该交换命令/消息。所以你应该首先告诉应该发生什么。之后,您可以编写代码来执行此操作。
标签: java android sockets connection