今天写了一个socket的服务器端的程序,但是在接受数据时出现问题,我用sockettool(socket调试工具)发东西过来的时候,只有断开sockettool的时候,服务器这边才能接受到数据,请问这是怎么回事儿,下面是写的代码
import java.io.*;
import java.net.*;
public class AcceptData { /**
* @param args
*/
public static void main(String[] args) {
AcceptData ad=new AcceptData();
}
public AcceptData()
{
try {
ServerSocket ss=new ServerSocket(12345);
System.out.println("正在监听12345端口");
Socket s=ss.accept();
//读取数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
//读取从客户端发来的信息
String info=br.readLine();
System.out.println(info);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
public class AcceptData { /**
* @param args
*/
public static void main(String[] args) {
AcceptData ad=new AcceptData();
}
public AcceptData()
{
try {
ServerSocket ss=new ServerSocket(12345);
System.out.println("正在监听12345端口");
Socket s=ss.accept();
//读取数据
InputStreamReader isr=new InputStreamReader(s.getInputStream());
BufferedReader br=new BufferedReader(isr);
//读取从客户端发来的信息
String info=br.readLine();
System.out.println(info);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
可能原因是, String info=br.readLine();这句是读入一行,而判断是否为一行就是碰到"\r\n",你在发送之前按"回车",正好给行末加了"\r\n".
如果做项目用,apache mina吧。
虽然我自己会习惯自己写,在项目中出错是少不了的。
如果你希望你的性能和稳定度更高,先用框架吧。
可以不用readLine(),重新设置读取判断条件,和输出
楼主发送数据,没有自定义传输协议,每次传输的信息,基本上是以回车换行符最为区分的。
所以,客户端不输入回车换行符,就表明本次传输的数据,没有完成,服务端的读取方法持久阻塞。
其次就是,客户端写入数据后(包括回车换行符),没有调用flush方法,将发送缓存区的数据推到网络上,造成服务端因为没有收到数据而持续阻塞。
或者全部写完后调用flush。
flush是关键所在