【问题标题】:Simple java TCP client简单的 java TCP 客户端
【发布时间】:2018-06-07 09:24:03
【问题描述】:

我在 ESP8266 上有一个经过测试的服务器,带有环回和一个不发送消息的 tcp 客户端应用程序。我还在一台服务器上对其进行了测试,该服务器会告诉您是否有人连接并且它说它已连接。

当我点击发送时,“聊天”textView 会显示消息。

例如:Client: message,但它不会将其发送到服务器以使其循环返回。

我应该为它更改什么以便发送和接收消息?

客户

package com.example.tinemasilo.researchgate_sockettut;

import android.app.Activity;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;

public class MainActivity extends Activity
{

static EditText serverIp,smessage;
static TextView chat;
static Button connectPhones,disconnectPhones,sent;
static String serverIpAddress = "",msg = "",str;
Handler handler = new Handler();
//static InetAddress serverAddr;
static Socket socket;
static DataOutputStream os;
//static DataInputStream in;
static BufferedReader in;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    chat = (TextView) findViewById(R.id.chat);
    serverIp = (EditText) findViewById(R.id.server_ip);
    smessage = (EditText) findViewById(R.id.smessage);

    sent = (Button) findViewById(R.id.sent_button);
    connectPhones = (Button) findViewById(R.id.connectPhones);
    disconnectPhones = (Button) findViewById(R.id.disconnectPhones);

    connectPhones.setEnabled(true);
    connectPhones.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            connectPhones.setEnabled(false);
            disconnectPhones.setEnabled(true);
            serverIpAddress = serverIp.getText().toString();
            //try
            //{
            //    InetAddress.getByName(serverIpAddress);
            //    serverAddr.getByName(serverIpAddress);
            //    socket = new Socket(serverAddr, 10000);
            //}
            // catch (IOException e)
            //{
            //}

            if (!serverIpAddress.equals(""))
            {
                Thread clientThread = new Thread(new ClientThread());
                clientThread.start();
            }

        }
    });

    sent.setOnClickListener(new View.OnClickListener()
     {
        public void onClick(View v)
        {
             Thread sentThread = new Thread(new sentMessage());
             sentThread.start();
         }
     });

      disconnectPhones.setEnabled(false);
      disconnectPhones.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v)
         {
            connectPhones.setEnabled(true);
            disconnectPhones.setEnabled(false);
                try
                {
                 socket.close();
                }
                catch (IOException e)
                {
                }
          }
      });
}

public class ClientThread implements Runnable
{
    public void run()
    {
        try
        {

            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            //serverAddr.getByName(serverIpAddress);
            socket = new Socket(serverAddr, 502);


            while(true)
            {
                //InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
                //serverAddr.getByName(serverIpAddress);
                //socket = new Socket(serverAddr, 10000);
                //in = new DataInputStream(socket.getInputStream());
                in = new BufferedReader( new InputStreamReader(socket.getInputStream()));
                String line = null;
                while ((line = in.readLine()) != null)
                {
                    msg = msg + "Server : " + line + "\n";
                    handler.post(new Runnable()
                    {
                        @Override
                        public void run()
                        {
                            chat.setText(msg);
                        }
                    });
                }
                in.close();
                Thread.sleep(100);
            }
        }
        catch (Exception e)
        {
        }
    }
}

class sentMessage implements Runnable
{
    @Override
    public void run()
    {
        try
        {

            InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
            //serverAddr.getByName(serverIpAddress);
            socket = new Socket(serverAddr, 502);

            os = new DataOutputStream(socket.getOutputStream());
            str = smessage.getText().toString();
            str = str + "\n";
            msg = msg + "Client : " + str;
            handler.post(new Runnable()
            {
                @Override
                public void run()
                {
                    chat.setText(msg);
                }
            });
            os.writeBytes(str);
            os.flush();
            os.close();
            }
        catch(IOException e)
        {
        }
    }
}
}

【问题讨论】:

  • 请说明您的问题。
  • 你的服务器支持多连接吗?
  • socket = new Socket(serverAddr, 502); 你有两次。在第二次调用中,您丢弃了对第一个套接字的引用。所以你正在创建两个客户端。现在服务器可以处理两个客户端吗? (之前被问过)。
  • 为什么要声明所有字段都是静态的?将它们设为私有。
  • 所以我必须把socket作为一个全局的?

标签: java android sockets tcp tcpsocket


【解决方案1】:

您正在尝试在sentThread 的同一端口上创建新的Socket 连接。第一个连接是在ClientThread 类中创建的,当您按下sent 按钮时,您正在同一端口502 上创建另一个Socket 连接。我认为这是主要问题。

尝试在sentThread 类中使用现有的Socket 连接。

class sentMessage implements Runnable
{
  @Override
  public void run()
  {
    try
    {

        //InetAddress serverAddr = InetAddress.getByName(serverIpAddress);
        //serverAddr.getByName(serverIpAddress);
       // socket = new Socket(serverAddr, 502);

       // os = new DataOutputStream(socket.getOutputStream());
        str = smessage.getText().toString();
        str = str + "\n";
        msg = msg + "Client : " + str;
        handler.post(new Runnable()
        {
            @Override
            public void run()
            {
                chat.setText(msg);
            }
        });
        os.writeBytes(str);
        os.flush();
        //os.close();
        }
    catch(IOException e)
    {
    }
}
}

编辑: 您要发送多条消息然后不要关闭DataOutputStream。从 sentMessage 类中删除 os.close();os = new DataOutputStream(socket.getOutputStream()); 行。 第一次连接时初始化您的os。然后每次你想发送消息时使用 os 实例。

ClientThread类中,在连接创建后初始化os

   socket = new Socket(serverAddr, 502);
   os = new DataOutputStream(socket.getOutputStream());

【讨论】:

  • 不起作用,我只能发送一条消息,如果我想发送另一条,我必须关闭连接并重新连接。
  • 尝试调试发现问题
  • 更新答案请查看
  • 我按照您在编辑中所说的更改了代码,现在可以使用。谢谢!
猜你喜欢
  • 2016-11-04
  • 2011-12-16
  • 2016-01-01
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
相关资源
最近更新 更多