TCP通讯是严格区分客户端与服务器端的,在通讯时,必须先由客户端去链接服务器端才能实现通讯,服务器端不能够主动链接客户端,而且服务器端程序须要事先启动,等待客户端的链接。java
在JDK中提供了两个类用于实现TCP程序,一个是ServerSocket类,用于表示服务器端,一个是Socket类,用于表示客户端。数组
通讯时,首先建立表明服务器端的ServerSocket对象,该对象至关于开启一个服务,并等待客户端的链接,而后建立表明客户端的Socket对象向服务器端发出链接请求,服务器端响应请求,二者创建链接开始通讯。安全
ServerSocket对象负责监听某台计算机的某个端口号,在建立ServerSocket对象后,须要继续调用该对象的accept()方法,接收来自客户端的请求。当执行了accept()方法以后,服务器端程序会发生阻塞,直到客户端发出链接请求,accept()方法才会返回一个Scoket对象用于和客户端实现通讯,程序才能继续向下执行。服务器
在Socket类的经常使用方法中,getInputStream()和getOutStream()方法分别用于获取输入流和输出流。当客户端和服务端创建链接后,数据是以IO流的形式进行交互的,从而实现通讯。socket
要实现TCP通讯须要建立一个服务器端程序和一个客户端程序,为了保证数据传输的安全性,首先须要实现服务器端程序。spa
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链接上了服务器文件上传成功...