【问题标题】:Streaming data through sockets continuously in java在java中通过套接字连续流式传输数据
【发布时间】:2014-01-18 23:50:25
【问题描述】:

我想通过异步推送和拉取功能从一个端点向另一个端点发送/接收连续的数据流(peer2peer)

所以首先要解决通信问题,我从 jax-ws SOAP 绑定 Web 服务开始,因为它有一个用于推送机制的端点和 ws 寻址,但它似乎有很多开销(根据文档很重,而且由于不熟悉 ws -*,我还没有实现它,因为稍后我需要多个客户端监听流,并且流是 24/7 我想要线程可管理的套接字)。

然后我使用了 jax-rs,但其中不包含 ws-addressing。(jax-rs 2.0) 我还查看了 websockets,但它需要一个应用服务器,但我想要一个 jvm 支持的代码

所以,现在我正在尝试使用基本套接字,但我遇到的问题是通过服务器和客户端连续接收数据的套接字流式传输数据。 它适用于第一次阅读,但没有进一步。 其次,我怎样才能让它异步?

public class sSocket {  
public static void main(String args[]) throws IOException{  
    int i = 15000;
    ServerSocket ss;
    Socket socket = null;
    ss = new ServerSocket(i);        
    try
    {
        socket = ss.accept();
        socket.setKeepAlive(true);          

           int iii = 0;            
               System.out.println("New connection accepted " +  socket.getInetAddress() + ":" + socket.getPort());   
               BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
               BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

           while(iii<9)
           {
               Thread.sleep(2000);
               output.write("good" + iii + "\n");
               //System.out.print(input.readLine().toString());
               output.flush();
               iii++;
           }
               //socket.close();
       }        

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

public class cSocket {  
public static void main(String args[]) throws InterruptedException, IOException{
    Socket client = new Socket("127.0.0.1", 15000);     
try{
    client.setKeepAlive(true);
    DataOutputStream out = new DataOutputStream(client.getOutputStream());
    out.writeBytes("Hi Server! I'm " + client.getLocalSocketAddress() + "\n" );     
     BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream()));
     String s;       
     while(true){
     if((s = input.readLine()) != null)
    {
        System.out.println("Message from Server: " + s);
    }}
     //client.close();
    }
    catch(Exception e){
    e.printStackTrace();
    }
}
}

[toString() 不可用 - 没有挂起的线程] 我看到这会在 Eclipse 中停止代码。 问题似乎本质上源于客户端的 input.readLine():错误是连接重置:我认为这是因为 readLine() 已达到“EOF”

【问题讨论】:

    标签: java sockets bufferedreader


    【解决方案1】:

    不要继续创建新的流。在两端使用相同的插座。您正在丢失缓冲区中的数据。

    你不需要一直调用 setKeepalive()。一次就够了。

    【讨论】:

    • 我看到我在服务器代码上犯了一些错误,但我没有看到任何变化,客户端的代码仍然在停止。我删除了服务器上的 while(true) 和 keepAlive。
    • 您正在使用 BufferedReader 阅读,因此您应该使用 BufferedWriter 进行写作。
    • @EJP 正在创建一个程序,在该程序中我将 socket 称为 socket = new socket(ipadd, port),其中 ip 为 10.0.2.2,端口号为 8080。我收到 toString() 不可用的错误- 没有挂起的线程。如何解决此错误?
    • @AndroidOptimist 错误不是“toString() 不可用”。阅读整个堆栈跟踪,而不仅仅是您喜欢的部分。但是,您为什么要在对另一个问题的答案的评论中提出新问题?
    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 2014-07-23
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2013-04-27
    • 1970-01-01
    相关资源
    最近更新 更多