【问题标题】:is.readUTF() not recieving messageis.readUTF() 没有收到消息
【发布时间】:2015-01-12 08:44:07
【问题描述】:

对于 android 端的聊天程序,我通过 DataInput 流发送消息

Socket sck = new Socket();
sck.connect(new InetAddress("192.168.1.91",1500),2000);

if(sck.isConnected())
{
    DataOutputStream os = new DataOutputStream(sck.getOutputStream());
    os.writeUTf(msg);
    System.out.println("Message sent");
}

而在服务器端我的代码是

ServerSocket serv = new ServerSocket(1500);
Socket sock = serv.accept();
DataInputStream is = new DataInputStream(sock.getInputStream);    

String ans = is.readUTF();
System.out.println("Got"+ans);

但在服务器端,它似乎没有收到任何东西,仍在等待消息。但在客户端它显示发送的消息。

这是我的完整代码。

package in.prasilabs.eagleeye;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class EagleClient extends Thread
{

    public int ret = 0;
    private String ip;
    private int port;
    private Socket sck;
    private boolean estb = false;
    private DataInputStream is;
    private DataOutputStream os;
    private String rmsg = null;
    private String msg;
    private String username;
    private String password;

    public String reply;

    Data dt = new Data();

    public EagleClient() 
    {

    }
    public EagleClient(String ip, int port, String username, String password)
    {
        this.ip = ip;
        this.port = port;
        this.username = username;
        this.password = password;
    }

    public void run()
    {
        establish();
        if(estb == true)
        {
            sendInfo(username,password);
        }

    }
    public void establish()
    {
        int time_out = 2000;
        try 
        {
            System.out.println("trying to connect");
            sck = new Socket();
            sck.connect(new InetSocketAddress(dt.getIp(),dt.getServerPort()),time_out);
            estb = true;
            System.out.println("Established");

        }
        catch (UnknownHostException e) 
        {
            ret =0;
            e.printStackTrace();
        } 
        catch (IOException e) 
        {
            ret = 0;
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if(estb == true)
        {
            try {
                is = new DataInputStream(sck.getInputStream());
                os = new DataOutputStream(sck.getOutputStream());
                dt.setOS(os);
                dt.setIS(is);
                System.out.println("Messages are ready to send");
            } catch (IOException e) 
            {
                ret = 0;
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }
    public void sendInfo(String user,String password)
    {
        Data dt = new Data();
        is = dt.getIS();
        os = dt.getOS();
        String drport = Integer.toString(dt.getdrPort());
        try {
            os.writeUTF("logn");
            System.out.println("Sending user info");
            os.writeUTF(dt.getUsername());
            os.writeUTF(dt.getPassword());
            os.writeUTF(drport);
            reply = is.readUTF();
            if(reply.equals("success"))
                dt.setLoginStatus(true);
            else
                dt.setLoginStatus(false);
            System.out.println("ACk recieved");
        } catch (IOException e) {
            ret = 0;
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public int sendMessage(String msg)
    {
        Data dt = new Data();
        os = dt.getOS();
        is = dt.getIS();
        this.msg = msg;
        try {
            os.writeUTF(msg);
            System.out.println("Client :" +msg);
            recieveMessage();
        } catch (IOException e) {
            ret = 0;
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return ret;
    }
    public void recieveMessage()
    {
        try {
            System.out.println("Trying to get acknowledgement");
                sck.setSoTimeout(2000);
                rmsg = is.readUTF();
                if(rmsg.equals(msg))
                {
                    System.out.println("Ack recvd" +rmsg);
                    ret = 1;
                }
                else if(!msg.equalsIgnoreCase(rmsg))
                {
                    //sendMessage();
                    Thread.sleep(100);
                    System.out.println("Retrying");
                    rmsg = is.readUTF();
                    System.out.println("Ack recvd" +rmsg);
                    ret = 1;
                }
                else
                {
                    System.out.println("Message not recieved");
                    ret = 0;
                }
        } catch (IOException e) {
            ret = 0;
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InterruptedException e){
            e.printStackTrace();
        }
    }



}

【问题讨论】:

  • 您的服务器中没有 while 循环吗?你如何确保它总是在等待连接?
  • @Adeeb。是的,直到连接存在我在 ans = is.readUTf() 处有一个 while 循环
  • 在writeUTF之后尝试os.flush()
  • @laune DataOutputStreams 不需要刷新,除非它们是分层的流,即BufferedOutputStream
  • Socket.isConnected() 不会像您认为的那样做。具体来说,它不测试连接的状态。它只会告诉你 是否连接了 this Socket. 在调用 Socket.connect() 之后立即测试它是完全没有意义的。除非抛出异常,否则它将始终返回 true,在这种情况下,测试无法访问。

标签: java sockets serversocket datainputstream dataoutputstream


【解决方案1】:

尝试使用这样的东西:

String message = "";

while (!"end".equals(message)) {
    if (is.available() != 0) {
        message = dis.readUTF();
        System.out.println(message);
    }
}

我检查了这个 - 工作。服务器必须在客户端发送消息之前启动。

【讨论】:

  • 我只建议了方向。不是一个完整的解决方案。
  • 问题 - 服务器必须打印来自客户端的消息。我的帮助将解决问题。
  • @laune,在这种情况下有什么问题?为什么要减去?
  • 是的 - 不是最佳的,是的 - 这是不好的方法,但它解决了上述问题。我不理解像你这样的人。
  • 当你有一个阻塞的 readUTF 时,没有理由避免阻塞和不必要的循环,它确实在等待你。
猜你喜欢
  • 2011-09-07
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 2019-12-12
  • 2021-10-26
  • 2020-07-16
  • 2020-10-19
相关资源
最近更新 更多