Java 向服务器套接字发送数据和从服务器套接字接收数据

Java 向服务器套接字发送数据和从服务器套接字接收数据,java,sockets,Java,Sockets,我有一个服务器套接字和一个客户端套接字。我已经为这两个套接字创建了一个缓冲输入和输出流。我已经在它们之间建立了一个连接。现在我已经通过BufferedOutputStream将数据从客户端套接字发送到服务器套接字,并从服务器套接字读取数据并显示出来。当我尝试将数据发送回时对于客户端套接字,它抛出异常,表示套接字已关闭。 这是密码 服务器应用程序代码: import java.io.*; import java.net.*; public class MyServer { publ

我有一个服务器套接字和一个客户端套接字。我已经为这两个套接字创建了一个缓冲输入和输出流。我已经在它们之间建立了一个连接。现在我已经通过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循环中。
我的目标是将数据从客户端发送到服务器,然后将其显示,然后将数据发送回客户端并再次显示。我已成功地将数据从客户端发送到服务器并显示了数据,但我无法将其发送回客户端。我的方法有什么问题。我不需要代码来说明如何发送和接收数据不关闭连接。

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

Socket.getOutputStream()的Javadoc中:

返回此套接字的输出流

如果此套接字具有关联的通道,则结果输出 流将其所有操作委托给通道。如果频道 处于非阻塞模式,则输出流的写入 行动将引发一场灾难 java.nio.channels.IllegalBlockingModeException

关闭返回的OutputStream 将关闭相关的插座。

如果要指示已完成对套接字的写入,请调用
socket.shutdownOutput()
。它的Javadoc声明:

Socket.shutdownOutput()

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


调用Socket.shutdownOutput()等待刷新数据后,可以关闭
输出流
输入流
、或
套接字
。(关闭哪一个并不重要-所有三个都将关闭
套接字

我读得很好,这不是我要问的,亲爱的,请至少阅读我的提问。我对此做了大量研究,但它仍然被降级。这样一个简陋的问题仍然存在。我上面提到的问题是,我的服务器套接字正在正确读取其输入流,但当我刷新服务器套接字输出流时,我无法从客户端套接字输入读取它流动我的应用程序要么从服务器套接字读取,要么从客户端套接字读取。我想要的是向服务器和客户端读取并显示客户端消息,以显示服务器发送给客户端的消息。当我在客户端应用程序中注释while循环时,它工作正常,但当我取消注释时,它会导致错误和错误服务器应用程序中的while循环甚至没有执行。我所说的关于客户端的内容也适用于服务器代码。在服务器上调用
cSocket.close()
之前,调用
cSocket.shutdownOutput()
。我刚刚在这里测试了它,如果在关闭OutputStreams或套接字之前调用
Socket.shutdownOutput()
,它工作得很好。在完成您所说的操作后,让我发布我的代码,然后您尝试运行它,它甚至没有进入服务器代码的while循环。请检查它。我已经在您告诉我要更改的内容后发布了已编辑的代码。在您的环境中运行它,然后查看