java - 套接字客户端卡在 'waiting for message from server.'

标签 java android sockets connection

背景故事: 我创建了一个可以与我的作品服务器连接的条形码扫描应用程序。条形码应用程序功能完美,但是,我没有与服务器进行套接字连接的经验。因此,为了不弄乱条形码应用程序中的任何代码,我复制了套接字连接的教程并对其进行了编辑。一旦我可以获得测试代码来完成连接并来回发送数据,我会将其实现到 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

最佳答案

import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLException;
import javax.imageio.ImageIO;

public class ServerPrintScreen
        extends Thread {

    private ServerSocket serverSocket;

    public ServerPrintScreen(int port)
            throws IOException, SQLException, ClassNotFoundException, Exception {
        serverSocket = new ServerSocket(port);
        serverSocket.setSoTimeout(0);
    }

    public void run() {
        try {
            while (true) {
                Socket clientSocket = serverSocket.accept();
                Throwable localThrowable3 = null;
                try {
                    System.out.println("client connected");
                    clientSocket.setKeepAlive(true);
                    String httpResponse = "HTTP/1.1 200 OK\r\nAccess-Control-Allow-Origin: *\r\nAccept-Ranges: bytes\r\nContent-Disposition: inline;filename=screenShot.jpg\r\nContent-Type: image/jpg\r\n\r\n";
                    BufferedImage originalImage = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
                    clientSocket.getOutputStream().write(httpResponse.getBytes("UTF-8"));
                    ImageIO.write(originalImage, "jpg", clientSocket.getOutputStream());
                    clientSocket.getOutputStream().flush();
                    clientSocket.getOutputStream().close();
                    clientSocket.close();
                    System.out.println("sent");
                } catch (Throwable localThrowable1) {
                    localThrowable3 = localThrowable1;
                    throw localThrowable1;
                } finally {
                    if (clientSocket != null) {
                        if (localThrowable3 != null) {
                            try {
                                clientSocket.close();
                            } catch (Throwable localThrowable2) {
                                localThrowable3.addSuppressed(localThrowable2);
                            }
                        } else {
                            clientSocket.close();
                        }
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        }
    }

    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException, Exception {
        Thread t = new ServerPrintScreen(25000);
        t.start();
    }
}

关于java - 套接字客户端卡在 'waiting for message from server.',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455656/

相关文章:

java - 使用 Spring 框架在 JavaScript 函数中调用 HTML 编码

java - Java TreeSet 使用的内存是否比 PriorityQueue 少?

android - 如何增加 CollapsingToolbarLayout 中标题的字体大小?

java - Android 客户端没有从 node.js 服务器接收到 socket.io 消息

c# - 现有连接被远程主机强制关闭

java - 如何使用 hibernate 映射插入当前时间戳?

java - 父 LinearLayout 不限制内部 TextView 的大小设置为 WRAP_CONTENT

java - 无法在 Java Android 中使用 dagger2 在 fragment 中注入(inject)依赖项

java - 如何发现监听端口 x 的 IP 地址

java - Android 中的并发