TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。
在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。
ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。
Socket类的常用方法中,getInputStream()和getOutStream()方法分别用于获取输入流和输出流。
* 实现TCP 服务器程序
* 表示服务器程序的类 java.net.ServerSocket
* 构造方法:
* ServerSocket(int port)传递端口号
* 很重要的事情:必须要获得客户端的套接字对象Socket
* Socket accept()
* 1,创建服务器ServerSocket对象(指定服务器端口号)
* 2,开启服务器了,等待客户端的连接,当客户端连接后,可以获取到连接服务器的客户端Socket对象
* 3,给客户端反馈信息
* 4,关闭流资源
*/
/*
* 实现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.demo03; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class TCPClient { //客户端 public static void main(String[] args) throws IOException, IOException { // 创建客户端对象,明确要连接的服务器所在的IP地址和端口号 Socket socket=new Socket("192.168.1.171",8888); //创建文件字节输入流,明确数据源 FileInputStream fis=new FileInputStream("D:\io1227\a.png"); //明确目的地 OutputStream out=socket.getOutputStream(); byte[] bytes=new byte[1024]; int len=0; //开始复制 while((len=fis.read(bytes))!=-1){ out.write(bytes,0,len); } //告知服务器没有了,别读了 socket.shutdownOutput(); //接收服务器回复 //获取字节输入流 InputStream in=socket.getInputStream(); //获取IP地址 String ip=socket.getInetAddress().getHostAddress(); len=in.read(bytes); System.out.println("ip地址为:"+ip+",发送的内容为:"+new String(bytes,0,len)); //释放资源 socket.close(); fis.close(); } }
package com.oracle.demo03; 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; public class TCPServer { //服务器端 public static void main(String[] args) throws IOException { // 创建服务器对象,明确端口号 ServerSocket server=new ServerSocket(8888); //创建连接并获取与我联接的客户端对象 Socket socket=server.accept(); //明确数据源 InputStream in=socket.getInputStream(); File file=new File("D:\upload"); if(!file.exists()){ file.mkdirs(); } //封装文件名 String filename="oracle"+System.currentTimeMillis()+new Random().nextInt(999999)+".png"; 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); } //回复客户端 //获取字节输出流 OutputStream out=socket.getOutputStream(); out.write("收到".getBytes()); //释放资源 server.close(); fos.close(); } }