【问题标题】:Sending and recieving data to and from server sockets向服务器套接字发送和接收数据
【发布时间】:2014-03-22 15:21:07
【问题描述】:

我有一个服务器套接字和一个客户端套接字。我已经为这两个套接字创建了一个缓冲的输入和输出流。我已经在它们之间建立了连接。现在我已经通过客户端套接字将数据发送到服务器套接字BufferedOutputStream 并已从服务器套接字读取并显示它。当我尝试将数据发送回客户端套接字时,它会抛出异常,说套接字已关闭。 这是代码 服务器应用代码:

   import java.io.*;
import java.net.*;
public class MyServer 
{
    public static void main(String args[]) throws Exception
    {
        int c;
        ServerSocket myServer=new ServerSocket(4341);
        Socket cSocket;
        cSocket =myServer.accept();     
        System.out.println("connection made");
        InputStream in = cSocket.getInputStream();
        OutputStream out = cSocket.getOutputStream();
        BufferedInputStream bin = new BufferedInputStream(in);
        BufferedOutputStream bout = new BufferedOutputStream(out);
        while ((c=bin.read())!=-1)
        {   
            //c=in.read();
            System.out.println((char)c);
            bout.write(c);
            //System.out.print("junaid");
        }
        System.out.println("connection made");
        bout.flush();
        cSocket.shutdownOutput();
        cSocket.close();
        myServer.close();
    }
}

客户端应用程序:

import java.io.*;
import java.net.Socket;
public class IOStreams
{
    public static void main(String args[]) throws Exception
    {
        int c;
        Socket s = new Socket("localhost",4341);
        InputStream in=s.getInputStream();
        OutputStream out=s.getOutputStream();
        BufferedInputStream bin = new BufferedInputStream(s.getInputStream());
        BufferedOutputStream bout = new BufferedOutputStream(s.getOutputStream());
        String myStr="what is google";
        byte buf[] = myStr.getBytes();
        try
        {
            bout.write(buf);
        }
        catch(Exception e)
        {
            System.out.print(e);
        }
        bout.flush();
        //InputStream in = s.getInputStream();
        //OutputStream out =s.getOutputStream();        
        s.shutdownOutput();
        while((c=bin.read()) !=-1)
        {
            //System.out.print("junaid");
            System.out.print((char) c);
        }
        //System.out.println(a);
        s.close();
    }
}

问题是,当我只从服务器套接字输入流中读取时,它工作正常,但是当我也尝试从客户端套接字的输入流中读取时,它会抛出异常。我知道我已经关闭了客户端套接字的 bufferedOutputStream 但是如果我不关闭它会卡在服务器套接字的 while 循环中。 我的目标是将数据从客户端发送到服务器然后显示并将该数据发送回客户端并再次显示。我已成功将数据从客户端发送到服务器并显示但我无法发送它回到客户端。我的方法有什么问题。我不需要代码来了解如何在不关闭连接的情况下发送和接收数据。

【问题讨论】:

标签: java sockets


【解决方案1】:

不要关闭客户端中的 OutputStream (bout.close();)(至少在调用 Socket.shutdownOutput() 之前不要关闭,见下文)。

来自Socket.getOutputStream()的Javadoc:

返回此套接字的输出流。

如果此套接字有关联的通道,则结果输出 流将其所有操作委托给通道。如果频道 处于非阻塞模式,然后输出流的写入 操作会抛出一个 java.nio.channels.IllegalBlockingModeException。

关闭返回的OutputStream 将关闭关联的套接字。

如果您想表明您已完成对套接字的写入,请改为调用Socket.shutdownOutput()。它的 Javadoc 状态:

Socket.shutdownOutput():

禁用此套接字的输出流。对于 TCP 套接字,任何 先前写入的数据将被发送,然后是 TCP 的正常 连接终止顺序。

调用 Socket.shutdownOutput() 后,等待数据刷新,您可以关闭OutputStreamInputStreamSocket。 (关闭哪个并不重要 - 所有三个最终都会关闭Socket

【讨论】:

  • 我的问题仍然存在。我上面提到的问题是我的服务器套接字正在正确地从其输入流中读取,但是当我刷新服务器套接字输出流时,我无法从客户端套接字中读取它输入流,我的应用程序要么从服务器套接字读取,要么从客户端套接字读取。我想要的是读取客户端消息并将其显示给服务器,客户端同时显示服务器发送给客户端的消息时间
  • 当我在客户端应用程序中注释 while 循环时,它工作正常,但是当我取消注释它时,它会导致错误,并且服务器应用程序中的 while 循环甚至没有执行。
  • 我所说的关于客户端的内容也适用于服务器代码。在服务器上调用cSocket.close() 之前,调用cSocket.shutdownOutput()。我刚刚在这里测试过,在关闭 OutputStreams 或 Socket 之前调用 Socket.shutdownOutput() 效果很好。
  • 让我按照你说的做后发布我的代码,然后你尝试运行它,它甚至没有进入服务器代码的while循环。
  • 检查一下,在你告诉我改变之后,我已经发布了编辑后的代码。在你的环境中运行它并查看
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 1970-01-01
  • 2012-06-25
  • 2012-02-12
相关资源
最近更新 更多