我有一个服务器套接字和一个客户端套接字。我为这两个套接字创建了一个缓冲的输入和输出流。我已经在它们之间建立了连接。现在我已经通过客户端套接字将数据发送到服务器套接字了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循环中。 我的目标是将数据从客户端发送到服务器然后显示它并将数据发送回客户端并再次显示它。我已经成功地从客户端将数据发送到服务器并显示它但我无法发送它回到客户端。我的方法出了什么问题。我不需要代码,我需要如何在不关闭连接的情况下发送和接收数据。
答案 0 :(得分:1)
不要关闭客户端中的OutputStream(bout.close();
)(至少在调用Socket.shutdownOutput()
之前没有关闭,见下文)。
来自Socket.getOutputStream()
的Javadoc:
返回此套接字的输出流。
如果此套接字具有关联的通道,则生成输出 stream将其所有操作委托给该频道。如果是频道 处于非阻塞模式然后输出流的写入 操作将抛出一个 java.nio.channels.IllegalBlockingModeException。
关闭返回的OutputStream 将关闭相关的套接字。
如果您想表明您已完成写入套接字,请拨打Socket.shutdownOutput()
。这是Javadoc声明:
Socket.shutdownOutput()
:
禁用此套接字的输出流。对于TCP套接字,任何 之前写入的数据将被发送,然后是TCP的正常 连接终止序列。
在调用等待刷新数据的Socket.shutdownOutput()之后,您可以关闭OutputStream
,InputStream
或Socket
。 (你关闭哪个都没关系 - 这三个人最终会关闭Socket
)