1、发送端发送过来的数据,我就算当前只读了一部分,但是只要还是在循环体while(true)内循环读,就能继续把剩下的部分读出来,读完后就会阻塞,因此需要双方制定什么时候结束。
2、和发送端的通道建立后,在发送端不发送数据时,接收端会阻塞在read处,如果为文件时,读完了就返回-1,但是我们是开启的通道连接,不知道对面什么时候结束,所以会一直阻塞,当有数据进来就会继续往下执行,但是不会出while循环圈,除非break,还有就是设置socket.setSoTimeout,让它定时,超过这么长的时间没接收到数据就断开连接。
3、通信时不能在while里面写几个read,因为read会阻塞,所以如果想要几个read(既想做接收端也想做发送端),就需开线程处理。
4、当发送方一次发送大量数据时,通道中的数据可能不均匀,例如:发送方一次发送40万个字节,我一次只接收10万个,想的是四次接收完,但实际中可能不行,因为读数据时,可能一次没有读到10万个,因此就需拼接每次读取的数据,当长度为40万个时,退出循环,执行数据处理。
5、当和对方断开连接时,read返回的值都是-1或者null,看使用的是什么流,可以在程序中加入这一判断来结束连接。而不用使用setSoTimeOut设定多久没读到数据就断开。
发送端发一行东西过去,接收端收到了就回复收到
发送端
Socket socket=null;
OutputStream outputStream=null;
InputStream inputStream=null;
Scanner scanner=new Scanner(System.in);
String msg;
try {
//接收端服务器的端口号和ip
socket=new Socket("10.16.48.209",10086);
//输出流
outputStream = socket.getOutputStream();
//输入流
inputStream= socket.getInputStream();
int len;
byte[] bytes=new byte[100];
//设置超时时间
// socket.setSoTimeout(10000);
while (true){
//控制台输入数据
msg=scanner.nextLine();
outputStream.write(msg.getBytes());
outputStream.flush();
len= inputStream.read(bytes);
if (len != -1) {//将接收到的数据打印在控制台
System.out.println(new String(bytes));
}
//将接收字节清0,以防下一次数据比上次短时出错
Arrays.fill(bytes,(byte)0);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IoUtils.closeIo(null,socket,inputStream,outputStream);
}
接收端
public static void main(String[] args) {
ServerSocket server=null;
Socket socket=null;
InputStream inputStream=null;
OutputStream outputStream=null;
byte[] bytes=new byte[100];
int len;
try {
//设定接收端需绑定的端口号
server=new ServerSocket(10086);
//阻塞等待客户端连接
socket = server.accept();
//输出流
outputStream= socket.getOutputStream();
//输入流
inputStream=socket.getInputStream();
while (true) {
//读取发送端发送的数据
len=inputStream.read(bytes);
//接收到数据时
if (len!=-1) {
print(bytes,len);
outputStream.write("收到".getBytes());
outputStream.flush();
}
//将接收字节清0,以防下一次数据比上次短时出错
Arrays.fill(bytes, (byte) 0);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
IoUtils.closeIo(server,socket,inputStream,outputStream);
}
}
public static void print(byte[] bytes,int len){
System.out.println("->"+new String(bytes,0,len));
}