最近在学习Java的socket编程,在写服务器与客户端互相发消息的代码时一直出现服务器连接到客户端后就无反应了的问题,我的宝贵时间就一直在这个问题上活活的给消耗了好多QAQ,好在最后找到了问题,经过改进后的代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
class server{
ServerSocket ss = null;
BufferedReader br = null;
BufferedWriter bw = null;
public void Reception() {
try {
ss = new ServerSocket(8888);
System.out.println("正在等待客户端的请求...");
Socket s = ss.accept();
System.out.println("收到来自客户端的请求!");
System.out.println("客户端的IP地址为:"+s.getLocalAddress()+" 端口号为:"+s.getPort());
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
bw.write("hello i am server\n");
bw.flush();
String str = br.readLine();
System.out.println("接收到的客户端的信息为:"+str);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if(br != null) {
br.close();
}
if(bw != null) {
bw.close();
}
if(ss != null) {
ss.close();
}
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
}
在使用输出流输出数据时,如果直接使用缓冲输出流的write方法会造成程序堵塞,因为程序不知道你有没有向write写完数据,所以会一直堵塞在write方法那里,解决办法是在末尾加一个换行符\n
bw.write("hello i am server\n");
或者直接用printwrite来写数据(推荐)