1.实现传输文件
在计算机网络的学习中,我们知道在进程之间网络是通过TCP/IP协议实现的,下面我将以简单的文件传输的例子,教初学者如何用简单的TCP/UDP实现进程网络通信。
首先是Socket的介绍大家可以自行百度or听我的简单理解,我们在计算机网络中知道,进程之间网络通信是IP地址加端口号。而Sokect我的简单理解是河流之间的两个码头,端口号标记了码头,而IP地址是地点。
客户服务器模型
客户服务器模型是我希望读者朋友提前了解的预备知识,通俗易懂的讲,我们打开微信输入账号密码点击登陆后,客户机向服务器发送一个请求,微信那边服务器一直在监听特定的端口号,点击登陆后 便建立了连接。你可以与微信上的朋友和其他用户进行通信,可以传送文件。这就是简单的客户服务器模型介绍,
文件的输入输出流
这里不便简单介绍 没有基础的小伙伴看这个
输入输出流简单的介绍
代码块分析(服务器端)
我们一条线一条线的实现,从无到有的过程。
首先第一步创建服务器
ServerSocket serverSocket=new ServerSocket(9997);//1.创建服务器监听窗口
Socket socket=new Socket();//2创建Socket
System.out.print("服务器正在监听");
创建服务器,Socket。
2.第二步 在端口号监听
socket=serverSocket.accept();//3。监听到的返回给socket
System.out.print("连接成功");
3.第三步完成图中的黄色箭头读取客户端发送的消息并且保存字符串中,再生成,文件路径文件路径可以改
InputStream inputStream=socket.getInputStream();//获得那个流
byte[]arr=new byte[1024];//读到里面
int len=0;
String downFilename="";
while((len=inputStream.read(arr))!=-1)//4.读取要的文件名字
{
downFilename=downFilename+new String(arr,0,len);
}
String filename="";
if("dym2.jpg".equals(downFilename))
{
filename="src\\dym2.jpg";
}
第四步把服务器端本地的文件读入
BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(filename));//5.读文件流
byte arr2[]=Tool.readbyte(bufferedInputStream);//6.文件转换成Byte
第五步读取的本地文件写给客户端绿色箭头
OutputStream outputStream=socket.getOutputStream();//7.准备写文件.写文件流
outputStream.write(arr2);//8.输出写回
第六步关闭Socket和相关文件输入输出流
socket.shutdownOutput();
//==========关闭流
inputStream.close();
bufferedInputStream.close();
outputStream.close();
serverSocket.close();
socket.close();
这里还需要用到工具包,把读取的转换成字节数组保存
public static byte[]readbyte(InputStream is)throws Exception
{
ByteArrayOutputStream bos=new ByteArrayOutputStream();
byte[]b=new byte[1024];
int len;
while((len=is.read(b))!=-1)
bos.write(b,0,len);
byte[]array=bos.toByteArray();
bos.close();
return array;
}
服务器端总代码
package TCP文件下载;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class Serve {
public static void main(String[] args) throws Exception{
ServerSocket serverSocket=new ServerSocket(9997);//1.创建服务器监听窗口
Socket socket=new Socket();//2创建Socket
System.out.print("服务器正在监听");
socket=serverSocket.accept();//3。监听到的返回给socket
System.out.print("连接成功");
InputStream inputStream=socket.getInputStream();//获得那个流
byte[]arr=new byte[1024];//读到里面
int len=0;
String downFilename="";
while((len=inputStream.read(arr))!=-1)//4.读取要的文件名字
{
downFilename=downFilename+new String(arr,0,len);
}
String filename="";
if("dym2.jpg".equals(downFilename))
{
filename="src\\dym2.jpg";
}
BufferedInputStream bufferedInputStream=new BufferedInputStream(new FileInputStream(filename));//5.读文件流
byte arr2[]=Tool.readbyte(bufferedInputStream);//6.文件转换成Byte
OutputStream outputStream=socket.getOutputStream();//7.准备写文件.写文件流
outputStream.write(arr2);//8.输出写回
socket.shutdownOutput();
//==========关闭流
inputStream.close();
bufferedInputStream.close();
outputStream.close();
serverSocket.close();
socket.close();
}
}
客户端
package TCP文件下载;
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;
public class Client {
public static void main(String[] args) throws Exception {
Socket socket = new Socket(InetAddress.getLocalHost(), 9997);
System.out.print("输入要下载的文件名字");
Scanner myscanner=new Scanner(System.in);
String s=myscanner.next();
byte[]b=new byte[1024];
b=s.getBytes();
OutputStream outputStream=socket.getOutputStream();
outputStream.write(b);
socket.shutdownOutput();
//=========写入要传送什么文件
InputStream inputStream=socket.getInputStream();//获取服务器发来的图片
byte[]b2= Tool.readbyte(inputStream);//图片保存成字节数组
BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("D:\\dym2.jpg"));
bufferedOutputStream.write(b2);
//写进去 保存 准备关闭流
outputStream.close();
inputStream.close();
bufferedOutputStream.close();
socket.close();
System.out.print("客户端下载完毕");
}
}
内网与外网。
注意这里的通信指的是同一个局域网举例子就是
你在你大学宿舍,你女同学在另一个大学,实现通信是无法实现的,要实现跨局域网通信就需要云服务器了。
关于局域网和广域网,以及如何实现跨局域网通信
。