今天主要用java写了一个传送消息和传送文件的一个程序。其实实际上还是和java的io打交道。大家要明白的是,socket也是一种文件描述符。学过unix的童鞋应该都知道,网络编程从管道,双向管道,通道,到socket通信,其实还是通过文件描述符来玩字节和字符。所以大家要把java io方面的东西弄清楚。
贴程序:
服务器端:
import java.io.*;
import java.net.*;
class Server{
public static void main(String[] args){
try{
ServerSocket server = new ServerSocket(8088);
Socket client = server.accept();
DataInputStream datastream = new DataInputStream(client.getInputStream());
System.out.println(datastream.readUTF());
DataOutputStream datastream2 = new DataOutputStream(client.getOutputStream());
datastream2.writeUTF("cao");
// datastream2.flush();
datastream2.writeUTF("ni");
// datastream2.flush();
datastream2.writeUTF("ma");
File file = new File("C:\\Users\\Yelbosh\\Desktop\\box2d.pdf");
byte[] tem = new byte[1024];
int progress = 0;
long size = file.length();
datastream2.writeLong(size);
FileInputStream input = new FileInputStream(file);
while(progress < size){
int curr = input.read(tem);
datastream2.write(tem);
progress += curr;
System.out.println(progress);
}
server.close();
client.close();
}catch(Exception e){
System.out.println(e);
}
}
}
客户端:
import java.io.*;
import java.net.*;
class Client{
public static void main(String[] args){
try{
Socket socket = new Socket("localhost",8088);
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
DataInputStream dis = new DataInputStream(socket.getInputStream());
dos.writeUTF("I'm clients!!");
System.out.println(dis.readUTF());
System.out.println(dis.readUTF());
System.out.println(dis.readUTF());
File file = new File("C:\\Users\\Yelbosh\\Desktop\\box2d22222.pdf");
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
long size = dis.readLong();
int progress = 0;
byte[] tem = new byte[1024];
int x;
while((x = dis.read(tem)) != -1){
ostream.write(tem);
progress += x;
System.out.println(progress);
}
socket.close();
}catch(Exception e){
System.out.println(e);
}
}
}
注意serversocket的receive方法。javadoc上说是这么:
侦听并接受到此套接字的连接。此方法在进行连接之前一直阻塞。
所以其内部实现其实是通过while循环来实现的。所以如果没有客户端连接的话那么服务器端会一直处于阻塞状态而不会退出。
但是有一个地方我不太明白的是,如果客户端分几次在socket的outputstream中进行写入的时候,为什么不能从服务器端一次性的读出。我不知道这个内部的实现原理是什么,归根结底是因为io方面学得不够扎实。弄清楚之后会告诉大家的。