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)提交任务
网友评论