网络编程之TCP
TCP通信
TCP通信是严格区分客户端与服务器端的,在通信时,必须先由客户端去连接服务器端才能实现通信,服务器端不可以主动连接客户端,并且服务器端程序需要事先启动,等待客户端的连接。
在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。
通信时,首先创建代表服务器端的ServerSocket对象,该对象相当于开启一个服务,并等待客户端的连接,然后创建代表客户端的Socket对象向服务器端发出连接请求,服务器端响应请求,两者建立连接开始通信。
ServerSocket类:该类的实例对象可以实现一个服务器段的程序。
ServerSocket对象负责监听某台计算机的某个端口号,在创建ServerSocket对象后,需要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法之后,服务器端程序会发生阻塞,直到客户端发出连接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通信,程序才能继续向下执行。
Socket 类: 实现TCP客户端程序。
在Socket类的常用方法中,getInputStream()和getOutStream()方法分别用于获取输入流和输出流。当客户端和服务端建立连接后,数据是以IO流的形式进行交互的,从而实现通信。
要实现TCP通信需要创建一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先需要实现服务器端程序。
1 package udpdemo; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.net.Socket; 8 9 10 public class TCPClient { 11 private static int port=9999; 12 private static String ip="127.0.0.1"; 13 14 15 public static void main(String[] args) throws IOException, IOException { 16 byte[] bytes = new byte[1024]; 17 int len=0; 18 int l=0; 19 byte[] b= new byte[1024]; 20 //创建客户端Socket,指定要连接的端口和ip; 21 Socket socket = new Socket(ip,port); 22 23 /** 24 * 读取本地文件("E:\\1\\tx.jpg") 25 * 向服务器上传文件 26 */ 27 FileInputStream fis = new FileInputStream("E:\\1\\tx.jpg"); 28 OutputStream out = socket.getOutputStream(); 29 30 while((l=fis.read(b))!=-1) { 31 out.write(b,0,l); 32 } 33 34 System.out.println("文件发送成功...."); 35 socket.shutdownOutput();//不加这句,上传的文件无法使用,还在被服务器占用, 36 //shutdownOutput()发送消息告诉服务器,传送完毕,可以释放资源了 37 38 39 /** 40 * 读取服务器的反馈信息 41 */ 42 //创建一个保存信息的字节数组 43 //获取输入流 44 InputStream in = socket.getInputStream(); 45 while((len=in.read(bytes))!=-1) { 46 System.out.println(new String(bytes,0,len)); 47 } 48 fis.close(); 49 in.close(); 50 socket.close(); 51 } 52 }
/**************************************输出结果***************************************/
文件发送成功....
恭喜,连接服务器成功...
1 package udpdemo; 2 3 import java.io.BufferedOutputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.net.InetAddress; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 12 /** 13 * TCP通信 服务器端 14 * ServerSocket 15 * 16 * 17 */ 18 public class TCPServer { 19 public static void main(String[] args) throws IOException { 20 //创建服务器对象,指定服务器端口号(9999) 21 ServerSocket server=new ServerSocket(9999); 22 //accept()开启服务器,等待客户端连接,连接后返回一个客户端Socket对象 23 Socket socket = server.accept(); 24 //获取客户端连接对象 25 InetAddress ipObject=socket.getInetAddress(); 26 // 显示哪个ip连接了服务器 27 System.out.println("客户端:"+ipObject.getHostAddress()+"连接上了服务器"); 28 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\a\\a.jpg")); 29 /** 30 * 通过客户端socket对象获得输入流,从而可以实现读取数据,通过accept()方法获取正在连接服务器的客户端的对象, 31 * 调用客户端对象的输入流去读取客户端输出的数据, 32 * 33 */ 34 InputStream in = socket.getInputStream(); 35 //输入流循序读取客户端传来的数据,并通过输出流写入文件,实现上传功能 36 byte[] bytes = new byte[1024]; 37 int len =0; 38 while((len=in.read(bytes))!=-1) { 39 bos.write(bytes,0,len); 40 } 41 System.out.println("文件上传成功..."); 42 /* 43 * 服务器的反馈信息 44 */ 45 //通过Socket对象,拿到getOutputStream(),获取输出流,回复客户端"连接服务器成功" 46 OutputStream out=socket.getOutputStream(); 47 out.write("恭喜,连接服务器成功...".getBytes()); 48 //关闭流资源 49 bos.close(); 50 out.close(); 51 socket.close(); 52 } 53 }
/****************************************输出结果***************************************/
客户端:127.0.0.1连接上了服务器
文件上传成功...