TCP通信是严格区分客户端与服务器端 服务器端程序需要事先启动,等待客户端的连接
UDP中只有发送端和接收端,不区分客户端与服务器端
原理图:
实现TCP 服务器程序
* 表示服务器程序的类 java.net.ServerSocket
* 构造方法:
* ServerSocket(int port)传递端口号
* 很重要的事情:必须要获得客户端的套接字对象Socket
* Socket accept()
*
* 1,创建服务器ServerSocket对象(指定服务器端口号)
* 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
* 3,给客户端反馈信息
* 4,关闭流资源
package com.oracle.demo02; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class TCPServer { //Tcp服务器端 public static void main(String[] args) throws IOException { Scanner sc=new Scanner(System.in); //创建服务器端对象,名确端口号 ServerSocket sever=new ServerSocket(9999); while(true){ //创建连接 Socket socket=sever.accept(); //获取字节输入流来获取客户端数据 InputStream in=socket.getInputStream(); //创建字节数组接收数据 byte bytes[]=new byte[1024]; int len=in.read(bytes); //获取客户端ip地址 String ip=socket.getInetAddress().getHostAddress(); System.out.println("ip地址为"+ip+" 发送内容为"+new String(bytes,0,len)); //回复客户端 //获取字节输出流,准备给客户端写书据 OutputStream out=socket.getOutputStream(); //写出字节数组 out.write(sc.next().getBytes()); //释放资源 //sever.close(); } } }
实现TCP 客户端,连接到服务器
* 和服务器实现数据交换
* 实现TCP客户端程序的类 java.net.Soket
* 构造方法
* Socket(String host,int port) 传递服务器IP和端口号
* 注意:构造方法只要运行,就会和服务器进行连接,连接失败,抛出异常
* OutputStream getOutputStream() 返回套接字的输出流
* 作用:将数据输出,输出到服务器
* InputStream getInputStream() 返回套接字的输入流
* 作用:从服务器端读取数据
* 客户端服务器数据交换,必须使用套接字对象Socket中的获取的IO流,自己new流,不行
* 1,创建客户端Socket对象,(指定要连接的服务器地址与端口号)
* 2,获取服务器端的反馈回来的信息
* 3,关闭流资源
package com.oracle.demo02;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class TCOPlient {
public static void main(String[] args) throws UnknownHostException, IOException {
Scanner sc=new Scanner(System.in);
//创杰接收数组
byte bytes[]=new byte[1024];
while(true){
//创建客户端对象,来链接服务器
Socket socket=new Socket("127.0.0.1",9999);
//获取自己输出流,将数据传给服务器
OutputStream out=socket.getOutputStream();
//输出字节数组
out.write(sc.next().getBytes());
//接收服务器段回复
//获取字节输入流 接收服务器段回复
InputStream in=socket.getInputStream();
int len=in.read(bytes);
System.out.println(new String(bytes,0,len));
//释放资源
//socket.close();
}
}
}
文件上传原理图:
TCP上传服务器
- ServerSocket套接字对象,监听端口8888
- 方法accept()获取客户端的连接对象
- 客户端连接对象获取字节输入流,读取客户端发送图片
- 创建File对象,绑定上传文件夹
判断文件夹存在,不存在,再创建文件夹
- 创建字节输出流,数据目的File对象所在文件夹
- 字节读取图片,字节流将图片写入到目的文件夹中
- 将上传成功返回客户端
- 关闭资源
package com.oracle.demo04; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.Random; import java.util.Scanner; public class TCPServer { //Tcp服务器端 public static void main(String[] args) throws IOException { //创建服务器端对象,名确端口号 ServerSocket sever=new ServerSocket(9999); //创建连接 Socket socket=sever.accept(); //获取字节输入流来获取客户端数据 InputStream in=socket.getInputStream(); //明确目的地 File file=new File("D:\demo1018\upload"); //判断该文件是否存在 if (!file.exists()) { //如果不存在则创建文件夹 file.mkdirs(); } String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(6)+".txt"; //创建字节输出名 FileOutputStream fos=new FileOutputStream(file+file.separator+filename); //创建字节数组接收数据 byte bytes[]=new byte[1024]; int len=0; while((len=in.read(bytes))!=-1){ fos.write(bytes,0,len); } //获取客户端ip地址 //String ip=socket.getInetAddress().getHostAddress(); //System.out.println("ip地址为"+ip+" 发送内容为"+new String(bytes,0,len)); //回复客户端 //获取字节输出流,准备给客户端写书据 OutputStream out=socket.getOutputStream(); //写出字节数组 out.write("上传成功".getBytes()); //释放资源 fos.close(); sever.close(); } }
文件上传 客户端
实现步骤:
- Socket套接字连接服务器
- 通过Socket获取字节输出流,写图片
- 使用自己的流对象,读取图片数据源
FileInputStream
- 读取图片,使用字节输出流,将图片写到服务器
- 通过Socket套接字获取字节输入流
读取服务器发回来的上传成功
6.关闭资源
public void shutdownOutput() 禁用此Socket的输出流,间接的相当于告知了服务器数据写入完毕
package com.oracle.demo04; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; import java.util.Scanner; public class TCOClient { //tcp客户端 public static void main(String[] args) throws UnknownHostException, IOException { //创建客户端对象,来链接服务器 Socket socket=new Socket("127.0.0.1",9999); //获取自己输出流,将数据传给服务器 OutputStream out=socket.getOutputStream(); //明确数据源 FileInputStream fis=new FileInputStream("D:\demo1018\print.txt"); //开始复制 //输出字节数组 int len=0; //创杰接收数组 byte bytes[]=new byte[1024]; while ((len=fis.read(bytes))!=-1) { out.write(bytes,0,len); } //告知服务器不要读了,结束 socket.shutdownOutput(); //接收服务器段回复 //获取字节输入流 接收服务器段回复 InputStream in=socket.getInputStream(); len=in.read(bytes); System.out.println(new String(bytes,0,len)); //释放资源 fis.close(); socket.close(); } }