这是client端:package com.liqiang_2;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public class Client_One {
public static void main(String[] args) throws Exception {
Socket s = new Socket("localhost", 8089);
InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp;
while ((temp=reader.readLine()) != null) {
System.out.println(temp);
}
// 关闭资源
reader.close();
//pw.close();
in.close();
//out.close();
s.close();
}
}这是服务端:service
package com.liqiang_2;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Service {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8089); while (true) {
Socket incomming = ss.accept();
InputStream in = incomming.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
OutputStream out = incomming.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
pw.write("service acceped!这是服务端发给客户端的");
// 关闭资源
//reader.close();
pw.close();
//in.close();
out.close();
incomming.close();
}
}
}这样运行是没有问题的,但是我不注释service中的reader.close()和in.close().就会出错,我知道我service中的input没有用,但是我不清楚为什么我连接了inputStream为什么就不可以关掉了?
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;public class Client_One {
public static void main(String[] args) throws Exception {
Socket s = new Socket("localhost", 8089);
InputStream in = s.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String temp;
while ((temp=reader.readLine()) != null) {
System.out.println(temp);
}
// 关闭资源
reader.close();
//pw.close();
in.close();
//out.close();
s.close();
}
}这是服务端:service
package com.liqiang_2;import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;public class Service {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8089); while (true) {
Socket incomming = ss.accept();
InputStream in = incomming.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
OutputStream out = incomming.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
pw.write("service acceped!这是服务端发给客户端的");
// 关闭资源
//reader.close();
pw.close();
//in.close();
out.close();
incomming.close();
}
}
}这样运行是没有问题的,但是我不注释service中的reader.close()和in.close().就会出错,我知道我service中的input没有用,但是我不清楚为什么我连接了inputStream为什么就不可以关掉了?
我service服务打开,然后client连接上了,service发了一天语句后,service所持有的当前socket就关闭了,然后client就打印了啊和输入流应该是没有关系的
//reader.close();
pw.close();
//in.close();
out.close();
incomming.close();我说过了:reader(也包括in)关闭后socket的inputStream就关闭了,并且socket也会被关闭
如果你上述注释的代码没有注释掉的话,in.close()已经就把socket给关掉了,你再调用out.close()怎么可能不报错!(此时socket已经被关闭)
我的不是没有注释的话,不会报错,就是client 信息收不到了
public class Service {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8089); while (true) {
Socket incomming = ss.accept();
InputStream in = incomming.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
OutputStream out = incomming.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
pw.write("service acceped!这是服务端发给客户端的");
pw.flush();//刷新缓冲区
// 关闭资源
// 应为客户端和服务器端建立好连接后就会通过HTTP建立IO通道,当关闭某一方的输入和输出流
//都会导致对方IO通道中断,并抛出异常,Socket通信中一旦建立了IO连接,就不能关闭(除非想断开IO)。
//reader.close();
pw.close();
//in.close();
out.close();
incomming.close();
}
}
}
// 应为客户端和服务器端建立好连接后就会通过HTTP建立IO通道,当关闭某一方的输入和输出流
//都会导致对方IO通道中断,并抛出异常,Socket通信中一旦建立了IO连接,就不能关闭(除非想断开IO)。
你为什么只关闭输出而不关闭输入流
public class Service {
public static void main(String[] args) throws Exception {
ServerSocket ss = new ServerSocket(8089); while (true) {
Socket incomming = ss.accept();
InputStream in = incomming.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
OutputStream out = incomming.getOutputStream();
PrintWriter pw = new PrintWriter(out, true);
pw.write("service acceped!这是服务端发给客户端的");
pw.flush();//刷新缓冲区
// 关闭资源
// 应为客户端和服务器端建立好连接后就会通过HTTP建立IO通道,当关闭某一方的输入和输出流
//都会导致对方IO通道中断,并抛出异常,Socket通信中一旦建立了IO连接,就不能关闭(除非想断开IO)。
}
}
}好吧!我把代码给你写全吧,把你原来的所有关闭方法去掉,然后添加红色部分的代码就OK了。
就是这一句。。
这个是我的错。我还是那个问题:
什么我关闭输出流是可以发送的,就是输入流不可以关闭
因为你先关闭的输入流( reader)啊,这个时候socket就关闭了,但信息还没有发出去呢。
pw.write("service acceped!这是服务端发给客户端的");
// 关闭资源
reader.close();//这将导致incomming被关闭,你应该先关闭pw或者out,再关闭reader
pw.close();
in.close();
out.close();
incomming.close();不过我比较奇怪,你先关闭reader,客户端不报错吗?