【问题标题】:Socket can be send only once and the Textview is not gathering the information from the server套接字只能发送一次,Textview 不从服务器收集信息
【发布时间】:2013-08-30 15:58:18
【问题描述】:

我正在制作的程序中有两个问题...问题是我想通过 Edittext 将该信息通过 UDP 发送到服务器...问题是该程序仅在我第一次运行时运行程序,我的意思是,如果我打开应用程序并编写一些文本,信息会发送到服务器,但是如果我输入另一个内容并按下按钮以便发送新信息,它就不起作用了......另一件事是 TextView 没有附加信息,服务器发送了一些信息,但应用程序没有收集该信息......所以如果有人知道为什么会发生这种情况或我做错了什么,我感谢任何帮助! ...谢谢您的建议...

代码如下:

公共类 MainActivity 扩展 Activity 实现 View.OnClickListener {

public static final String SERVERIP = "190.99.20.200";
public static final int SERVERPORT = 5153;
public TextView serverResponse;
public EditText messageToSend;
public Button btnSend;
public boolean start;
public Handler handler;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    serverResponse = (TextView)findViewById(R.id.textView);
    messageToSend = (EditText)findViewById(R.id.editText);
    btnSend = (Button)findViewById(R.id.button);
    btnSend.setOnClickListener(this);
    start = false;
    new Thread(new Server()).start();
    try{
        Thread.sleep(500);
    }catch (InterruptedException e){
        updatetrack("Error on Server:" + e.getMessage());
    }
    new Thread(new Client()).start();
    handler = new Handler(){
        public void handledMessage(Message msg){
            String text = (String)msg.obj;
            serverResponse.append(text);
        }
    };
}

public class Client implements Runnable {

    @Override
    public void run() {
        while(start == false)
        {
        }
        try{
            Thread.sleep(500);
        }catch (InterruptedException e1){
            e1.printStackTrace();
        }
        try{
            InetAddress serverAddres = InetAddress.getByName(SERVERIP);
            updatetrack("Client:Start connectingn");
            DatagramSocket socket = new DatagramSocket();
            byte[] buffer;
            if(!messageToSend.getText().toString().isEmpty())
            {
                buffer = messageToSend.getText().toString().getBytes();
            }
            else
            {
                buffer = ("Message from android").getBytes();
            }
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length,serverAddres,SERVERPORT);
            updatetrack("Client:Sending" + new String(buffer)+ "'n");
            socket.send(packet);
            updatetrack("Client: Messange sentn");
            updatetrack("Client: Succed!n ");
            socket.close();
        }catch (Exception e){
            updatetrack("Client:Error!n" + e.getMessage());
        }
    }
}

public class Server implements Runnable{

    @Override
    public void run() {
        while (start == false)
        {
        }
        try{
            InetAddress serverAddress = InetAddress.getByName(SERVERIP);
            updatetrack("nServer: Start connectingn");
            DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddress);
            byte[] buffer = new byte[17];
            DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
            updatetrack("Server: Receivingn");
            socket.receive(packet);
            updatetrack("Server: Message received:" + new String(packet.getData())+"'n");
            updatetrack("Server : Succed!n");

        }catch (Exception e){
            updatetrack("Server: Error!n"+ e.getMessage());
        }
    }
}

public void onClick(View view)
{
    start = true;
}

public void updatetrack(String s)
{
    Message msg = new Message();
    String textTochange = s;
    msg.obj = textTochange;
    handler.sendMessage(msg);
}

}

【问题讨论】:

  • 您不需要在String 上调用toString(),正如getText(). 返回的那样
  • @EJP 谢谢你的回复,怎么样?那么它会是什么类型的呢?

标签: java android sockets interface udp


【解决方案1】:

服务器类中的run 方法将只运行一次。

while(start == false){
}

这个while循环会一直循环,直到你调用onClick方法,此时run()方法中的其余代码被执行,服务器线程被杀死。您需要稍微重新排列代码,并将其放在 while 循环中:

public void run() {
    while (true){

    try{
        InetAddress serverAddress = InetAddress.getByName(SERVERIP);
        updatetrack("nServer: Start connectingn");
        DatagramSocket socket = new DatagramSocket(SERVERPORT, serverAddress);
        byte[] buffer = new byte[17];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
        updatetrack("Server: Receivingn");
        socket.receive(packet);
        updatetrack("Server: Message received:" + new String(packet.getData())+"'n");
        updatetrack("Server : Succed!n");

    }catch (Exception e){
        updatetrack("Server: Error!n"+ e.getMessage());
    }
}
}

【讨论】:

  • 嗨@Daniel Mac,感谢您的回复,很抱歉迟到了,我做了更改,但是当我初始化应用程序时,我从updateTrack抛出空指针异常,我认为可能是因为服务器不回复,除非信息已发送...感谢您的建议
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多