java中用Socket向ServerSocket发送信息,ServerSocket用接收到的Socket返回一条信息,但是返回时报错...

Socket发送时不报错,ServerSocket可以接收,ServerSocket返回时报Socketisclosed错误,我并没有关闭Socket,只是在Socket... Socket发送时不报错,ServerSocket可以接收,ServerSocket返回时报Socket is closed错误,我并没有关闭Socket,只是在Socket使用OutputStream发送完信息将OutputStream流关闭,请问怎么解决?
服务端这样写:
ServerSocket server = new ServerSocket(SERVERPORT); while(flag) { Socket s = server.accept();
InputStream in = s.getInputStream(); byte[] bytes = new Byte[1024];
int i=0, t=0;
while((t=in.read()) != -1) {
bytes[i] = (byte)t;
i++;
}
String str = new String(bytes);
System.out.println(str); OutputStream out = s.getOutputStream();
String msg = "hello client";
out.write(msg.getBytes()); out.close(); }
客户端这样写:
Socket soc = new Socket("127.0.0.1", SERVERPORT);
OutputStream out = s.getOutputStream();
String msg = "hello server";
out.write(msg.getBytes());
out.close();
InputStream in = s.getInputStream(); byte[] bytes = new Byte[1024];
int i=0, t=0;
while((t=in.read()) != -1) {
bytes[i] = (byte)t;
i++;
}
String str = new String(bytes);
System.out.println(str);
求教大神!!!满意追加
展开
 我来答
小狂中E
2014-01-14 · TA获得超过1418个赞
知道大有可为答主
回答量:1514
采纳率:66%
帮助的人:1009万
展开全部
 static int SERVERPORT=12345;
 
 public static void main(String[] args) throws Exception {  
    boolean flag = true;
    ServerSocket server = new ServerSocket(SERVERPORT);            
    while(flag) {                
     Socket s = server.accept();                
     DataInputStream in = new DataInputStream(s.getInputStream()); 
     String str = in.readUTF();                
     System.out.println(str);                
     DataOutputStream out = new DataOutputStream(s.getOutputStream());                
     String msg = "hello client";                
     out.writeUTF(msg);       
     out.flush();         
   s.close();
    } 
  } 
 
public static void main(String[] args) throws Exception {
  Socket s = new Socket("127.0.0.1", SERVERPORT);            
  DataOutputStream out = new DataOutputStream(s.getOutputStream());            
  String msg = "hello server";            
  out.writeUTF(msg);
  out.flush();          
  DataInputStream in = new DataInputStream(s.getInputStream());            
  String str = in.readUTF();            
  System.out.println(str);  
  s.close();
 }

注意:流不能关闭,调用流的close方法会导致socket关闭

追问
谢谢你!能不能改成基础流InputStream和OutputStream,因为我们要处理byte数组,我之前改的用基础流的没有关闭流也是用flush()但还是不行
追答
程序还是你自己写,就当是练手吧。
不要用read()==-1来判断是否结束,而改用先写要写出的byte[]的长度,接收时先读长度,然后再用read(byte[] b, int off, int len)读,直到读满长度为止
百度网友7d4cdc4
2014-01-13
知道答主
回答量:53
采纳率:0%
帮助的人:13.1万
展开全部
while((t=in.read()) != -1) { <--改为 t=in.read(bytes) bytes[i] = (byte)t;
i++; }t的结果你独到的字节的个数 ,不是具体的值,具体的值已经保存到字节数组里面去了
应该这样
str += new String(bytes); 这样可以独到每一个具体的值

另外,你把out.close() 改成 out.flush() 你再测试下结果
更多追问追答
追问
服务器和客户端的读操作都这么写么?改的那句应该放哪?如果方便请把循环整个具体写下,谢谢!
追答
字数超出最大允许值,请删减!
要的化,就发个邮箱
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
冰火两重天
2014-01-14 · TA获得超过1425个赞
知道小有建树答主
回答量:1489
采纳率:0%
帮助的人:980万
展开全部
你 服务器端写完之后就关闭了,所以会包socket is closed.
更多追问追答
追问
是服务器在接收到客户端Socket的时候开启一个线程专门和该客户端通信吗?
像这样:
Socket s = server.accept();
new Thread(new ClientThread(s)).start();
具体通信写在ClientThread里的run() 方法里的While(true)里么?
追答
不需要,你服务器端out.write(msg.getBytes());                out.close();            }
可以看出你服务器写完立马就关闭了。你把out.close()去掉试试
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友40d310f
2014-01-14 · 超过11用户采纳过TA的回答
知道答主
回答量:126
采纳率:0%
帮助的人:44.2万
展开全部
while((t=in.read()) != -1) { bytes[i] = (byte)t; i++; } String str = new String(bytes); System.out.println(str);
改为
while((i=in.read(bytes))!=-1){
System.out.print(new String(bytes,0,1))
}
追问
客户端和服务器的读操作都这么写么?这句--System.out.print(new String(bytes,0,1))--什么意思?循环变量 i 和每次循环取得的 t 都没有意义了,麻烦详解下整个循环到底怎么写?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式