服务端的代码:
一般在程序的运行过程中,我们的服务器是从来不会停止运行,因为也不可能每个客户运行的时候,他打开接收下,那么怎么做呢?
1,首先我们要让socket对象在调用accept监听方法的时候给他一个死循环
2,监听的时候,我们创建线程,这样就要考虑线程安全的问题
3,socket对象的作用域
4,我们在平时网上下载东西的时候,会看到一大串数字,那么这个是由什么造成的,为什么每次下载的都不一样呢?
随机数
5,最后服务端接到客户端的请求之后,我们还要给客户端一个回复
public class TCPServer { public static void main(String[] args) throws IOException { //新建一个服务器接收的地址 File file = new File("d:\upload"); //判断是否这个文件是否存在,如果不存在,那么新建一个 if(file.exists()!=true){ file.mkdir(); } //新建一个服务端的对象。并确定端口号 ServerSocket server = new ServerSocket(9999); //创建一个死循环,让服务器不会停止 while(true){ //让服务器处于不断监听的状态 Socket socket = server.accept(); //创建线程并重写run方法 new Thread(new Runnable() { @Override public void run() { //把socket对象放在成员变量的位置,提升作用域 InputStream is = null; try { //解决线程安全 is = socket.getInputStream(); //重新定义一个照片名字,并生成随机数和当前毫秒值 String fileName="kgc"+System.currentTimeMillis()+new Random().nextInt(999999)+".jpg"; //网络输出流的名字 FileOutputStream fos = new FileOutputStream(file.toString()+"\"+fileName); //定义个数组 byte[]bytes=new byte[1024]; int len=0; while((len=is.read(bytes))!=-1){ fos.write(bytes,0,len); } //服务端的对象收到客户端的请求之后,会给他一个回复,这里用getoutStream OutputStream os = socket.getOutputStream(); os.write("收到了!".getBytes());//写的内容转换成字节数组 fos.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } } }
这个是客户端的代码:
注意:
1,首先我们要创建一个要上传的文件的路径
2,新建socket对象,并给出IP地址和端口号
3,进行读,写
注意:在客户端读文件的大小的时候,一定要注意如果字节读完之后,就是null值,程序会陷入一个死循环
这里需要用到一个方法 shutdownOutput();
4,把服务端发过来的信息,读取出来,并转换成字符串
public class TCPLIent { public static void main(String[] args) throws IOException { FileInputStream fis = new FileInputStream("d:\ruirui.jpg"); Socket socket = new Socket("127.0.0.1",9999); OutputStream os = socket.getOutputStream(); byte [] bytes=new byte[1024]; int len=0; while((len=fis.read(bytes))!=-1){ os.write(bytes,0,len); } socket.shutdownOutput(); InputStream is = socket.getInputStream(); int le=0; while((le=is.read(bytes))!=-1){ System.out.println(new String(bytes,0,le)); } fis.close(); socket.close(); } }