基于TCP协议的Socket编程和通信随笔
简述
在网络通讯中,第一次主动发起通讯的程序被称作客户端(Client)程序,简称客户端,而在第一次通讯中等待连接的程序被称作服务器端(Server)程序,简称服务器。一旦通讯建立,则客户端和服务器端完全一样,没有本质的区别。
基本流程
- 创建服务器ServerSocket,在创建时,定义ServerSocket的监听端口(在这个端口接收客户端发来的消息)。
- ServerSocket调用accept()方法,使之处于阻塞状态。
- 创建客户端Socket,并设置服务器的IP及端口。
- 客户端发出连接请求,建立连接。
- 分别取得服务器和客户端Socket的InputStream和OutputStream。
- 利用Socket和ServerSocket进行数据传输。
- 关闭流及Socket。
通过Socket进行两个电脑之间的文件传输
服务器端进行传输
{
System.out.println("server");
ServerSocket serverSocket = new ServerSocket(6666);
Socket socket = serverSocket.accept();
System.out.println("客户端建立连接");
BufferedOutputStream bo = null;
BufferedInputStream bf = null;
//得到一个文件
File input = new File("F:/壁纸");
//判断该文件是不是文件夹
if(input.isDirectory()){
//得到文件夹里面所有的文件放到数组里
File[] file = input.listFiles();
//循环遍历数组
for(File file1 : file){
//判断是不是文件
if(file1.isFile()){
System.out.println(file1);
//循环一一写入并传给客户端
bf = new BufferedInputStream(new FileInputStream(file1));
bo = new BufferedOutputStream(socket.getOutputStream());
int temp = 0;
while((temp = bf.read())!=-1){
bo.write(temp);
}
}
}
}else{
bf = new BufferedInputStream(new FileInputStream(input));
bo = new BufferedOutputStream(socket.getOutputStream());
int temp = 0;
while((temp = bf.read())!=-1){
bo.write(temp);
}
}
bo.flush();
bo.close();
bf.close();
socket.close();
serverSocket.close();
}
客户端进行接收
{
System.out.println("client");
Socket server = new Socket("localhost",6666);
BufferedInputStream bf = null;
BufferedOutputStream bo = null;
System.out.println("客户端建立连接");
//得到服务器需要发送的文件夹
File input = new File("F:/壁纸");
//循环获取
for(int i = 0; i<input.listFiles().length;i++){
bf = new BufferedInputStream(server.getInputStream());
//循环写入
bo = new BufferedOutputStream(new FileOutputStream("F:/"+"test"+i+".jpg"));
int temp = 0;
while((temp = bf.read())!=-1){
bo.write(temp);
}
}
bo.flush();
bo.close();
bf.close();
server.close();
}
注:这里只简易的实现了单向传输,还有很多的功能可以通过这个代码进行扩展。