【问题标题】:Connection is success, when client sent data not reached to server but client disconnects data sent to server连接成功,当客户端发送数据未到达服务器但客户端断开发送到服务器的数据时
【发布时间】:2017-03-11 10:50:59
【问题描述】:

在这里我放了一些代码,连接建立,但是每当客户端想要向服务器发送一些数据时,如果客户端断开连接数据,一旦到达服务器就不会发送数据如何解决该问题。

我想要什么: 如果连接建立并且连接没有关闭。

public class Server extends AppCompatActivity {

private ServerSocket serverSocket;
Handler UIHandler;
Thread Thread1 = null;
EditText edText;
public static final int SERVERPORT = 3000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_server);
    getSupportActionBar().setTitle("Server");
    edText = (EditText) findViewById(R.id.editText);
    UIHandler = new Handler();
    this.Thread1 = new Thread(new Thread1());
    this.Thread1.start();

}

class Thread1 implements Runnable {
    InetAddress addr;

    @Override
    public void run() {
        Socket socket = null;
        try {
            addr = InetAddress.getByName(getLocalIpAddress());
            serverSocket = new ServerSocket(SERVERPORT);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        while (!Thread.currentThread().isInterrupted()) {
            try {
                socket = serverSocket.accept();

                Thread2 commThread = new Thread2(socket);

                new Thread(commThread).start();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

private String getLocalIpAddress() throws Exception {
    String resultIpv6 = "";
    String resultIpv4 = "";

    for (Enumeration en = NetworkInterface.getNetworkInterfaces();
         en.hasMoreElements(); ) {

        NetworkInterface intf = (NetworkInterface) en.nextElement();
        for (Enumeration enumIpAddr = intf.getInetAddresses();
             enumIpAddr.hasMoreElements(); ) {

            InetAddress inetAddress = (InetAddress) enumIpAddr.nextElement();
            if (!inetAddress.isLoopbackAddress()) {
                if (inetAddress instanceof Inet4Address) {
                    resultIpv4 = inetAddress.getHostAddress().toString();
                } else if (inetAddress instanceof Inet6Address) {
                    resultIpv6 = inetAddress.getHostAddress().toString();
                }
            }
        }
    }
    return ((resultIpv4.length() > 0) ? resultIpv4 : resultIpv6);
}

private class Thread2 implements Runnable {
    Socket clientSocket;
    BufferedReader input;
    String read;

    public Thread2(Socket clientSocket) {
        this.clientSocket = clientSocket;

        try {
            this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {

            try {

                read = this.input.readLine();

                if (read != null) {

                    Server.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            edText.setText(edText.getText().toString() + "Client says: " + read + "\n");
                            Log.i("hhFULL", edText.getText().toString());
                        }
                    });
                } else {

                    Thread1 = new Thread(new Thread1());
                    Thread1.start();
                    return;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

【问题讨论】:

  • 这里没有客户端代码。不清楚你在问什么。
  • 这里出于测试目的,我使用 TCP Client 是 Hercules 实用程序(s/w)。亲爱的@EJP,是的,当任何客户端(s/w)连接到该服务器连接时,它是服务器代码,但是当客户端向服务器发送一些文本直到客户端断开连接时才到达。
  • 所以贴出客户端代码。你不能随便断定问题一定出在服务器代码中。

标签: java android sockets serversocket


【解决方案1】:

这可能是因为您使用的客户端发送的消息最后没有 \n 或 \r。下面从 inputStream 读取一行的代码无限等待换行符:-

read = this.input.readLine();

【讨论】:

    【解决方案2】:

    问题解决了,客户端发送一些数据,需要(ASCII码)换行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-27
      • 2022-01-12
      • 2013-04-11
      • 2021-12-07
      • 2015-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多