网络编程

01 网络编程的三要素

1.协议:能够保证数据传输通畅

2.IP地址:定义到网络中的某个终端设备

3.端口:定位到这个终端设备部的具体的进程

客户端程序Socket

类的使用:

1)创建对象

public Socket(String host,int port):可以连接指定地址,指定端口的服务器

2)使用方法:

public OutputStream getIutputStream():获取输入流:从网络中读取数据

public OutputStream getOutputStream():获取输出流,写出数据到网络

public void shoudownOutput():关闭输出流,发送接收标记,不会关闭连接。

public void close():关闭Socket连接

步骤:

1)要创建Socket对象,连接指定的服务端

2)获得输出流,写出数据

3)关闭输出流

4)获取输入流,读取数据

5)关闭连接

02TCP 服务端编程

SeverSocket;服务端的类

创建对象

public ServerSocket(int port):监听本地的端口号

常用方法

public Socket accept():接收服务端的连接,如果客户端没有连接过来,该方法处于阻塞状态【一直等客户端连接过来】

public void close

步骤:

1)创建服务器端ServerSocket对象,监听指定端口;

2)接收客户端的连接,获取对应的Socket对象【accept】

3)获取对象的输入流,获得客户端写出的数据

4)获取客户端的输出流,写出数据到客户端

5)告诉客户端写出数据完毕【shutdownOutput】

6)关闭socket对象连接

7)关闭服务器

03文件上传客户端实现

/*

客户端: 读取本地得文件写出到网络

步骤分析:

1)创建Socket对象和服务端建立连接

2)先获取本地得文件数据【输入流】,获取网络数据流 【边读边写】

3)告诉服务端,我数据发送完毕

4)接收服务端数据

5)关闭socket连接

文件上传服务端:ServerSocket

就是读取网络中的数据,写出到本地中去

*/

public class Client{

public static void main(String[]args)throws IO Exception{

//1)创建Socket对象和服务端建立连接

Socketsocket=newSocket("127.0.0.1",8888);

//2)先获取本地得文件数据【输入流】,获取网络数据流 【边读边写】

FileInputStreamlocalIn=newFileInputStream("client/beauty.jpg");

OutputStreamnetOut=socket.getOutputStream();

int len;

byte[]bytes=newbyte[1024];

while((len=localIn.read(bytes))!=-1) {//读取本地数据

netOut.write(bytes,0,len);// 写出数据到网络

       }

//3)告诉服务端,我数据发送完毕

socket.shutdownOutput();

//4)接收服务端数据

InputStreamnetIn=socket.getInputStream();

while((len=netIn.read(bytes))!=-1) {

System.out.println(newString(bytes,0,len));

       }

//5)关闭socket连接

socket.close();

   }

}

04文件上传服务端实现

1)创建服务器对象:ServerSocket

2)等待客户端连接,得到socket对象:accept

3)读取网络中的数据并写出到本地硬盘

3.1通过socket对象获取网络输入流

3.2创建本地的输出流用来写出数据

4)发送一个信息给客户端,完成上传

5)关闭socket连接

6)关服务器

publicclassServer{

publicstaticvoidmain(String[]args)throwsIOException{

//1)创建服务端对象:ServerSocket

ServerSocketserverSocket=newServerSocket(8888);

//2)等待客户端连接,得到socket对象:accept

System.out.println("等待客端连接....");

Socketsocket=serverSocket.accept();

System.out.println("客端连接成功...."+socket.getInetAddress());

//3)读取网络中得数据并写出到本地磁盘

//3.1 通过socket对象获取网络输入流

//3.2 创建本地得输出流用来写出数据

InputStreamnetIn=socket.getInputStream();

FileOutputStreamlocalOut=newFileOutputStream("server/beauty.jpg");

intlen;

byte[]bytes=newbyte[1024];

while((len=netIn.read(bytes))!=-1) {//读取网络数据

localOut.write(bytes,0,len);// 将数据写到本地磁盘

       }

//4)发一个信息给客户端,完成上传

OutputStreamnetOut=socket.getOutputStream();

netOut.write("恭喜,文件上传成功".getBytes());

socket.shutdownOutput();

//5)关socket连接

socket.close();

//6)关服务器

serverSocket.close();

   }

}




05 上传案例的服务端优化

解决问题

1)文件名重复:

解决方案:命名文件的时候,加上时间戳

FileOutputStream localOut = new FileOutputStream("server/beauty"+System.currentTimeMillis()+".jpg");

2)只能服务一次

    使用while(true){

        接收客端

        传输数据

    }

    低效

3)效率

    多线程解决

    线程池

    1)创建线程池

    2)创建任务:传输数据

    3)提交任务

你可能感兴趣的:(网络编程)