了解了Udp通信协议以后,咱们再认识一个经常使用的通信协议:Tcpjava
Tcp传输特色:网络
--依赖于Socket和ServerSocket对象tcp
--创建客户端和服务端ide
--创建链接后,经过Socket中的 IO 流进行数据的传输spa
--关闭Scoket.net
下面经过一个简单的例子认识一下:code
--tcp分客户端和服务端对象
--客户端对应的对象是Sockerblog
服务端对应的对象是ServerSocketip
//客户端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; /** * 客户端: * 经过查询Socket对象,发如今该对象创建时,就能够去链接指定的主机, * 由于Tcp是面向链接的,因此在创建Socket服务时,就要有服务端存在,并链接成功,造成通路后,在该通道进行数据传输 * * 需求:给服务端发送一个文本数据 */ public class TcpClient { public static void main(String[] args)throws Exception{ //建立客户端的Socket服务,指定目的主机和端口 Socket s = new Socket("127.0.0.1",11012); //为了发送数据,应获取Socket流中的输出流 OutputStream out = s.getOutputStream();//使用字节流 out.write("This's the first Tcp test Demo".getBytes()); //由于流是经过Socket得到的,全部一旦Socket关闭,流也随之关闭 s.close(); } }
//服务端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; /** * 需求:定义端点接收数据,并打印在控制台上 * * 一、简历ServerSocket服务,并监听一个端口 * 二、获取链接过来的客户端对象 * 经过ServerSocket的accept()方法,没有链接就会等,因此这个方法是阻塞的。 * 三、客户端若是发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流 * 来读取客户端发送过来的数据,并打印控制台; * 四、关闭服务端(可选) */ public class TcpServer { public static void main(String[] args){ try { //简历服务端Socket服务,并监听一个端口 ServerSocket ss = new ServerSocket(11012); //经过accept()方法获取链接过来的客户端对象 Socket s = ss.accept(); String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + ".........is connected"); //使用客户端对象的读取流读取客户端发送过来的数据 InputStream in = s.getInputStream();//其实是一个网络流 byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } catch (Exception e) { e.printStackTrace(); } } }
============================优雅的分割线============================
上面这两个例子,实现了客户端向服务端发送文本信息,服务端收到并将其打印到控制台。
如今咱们再对上面两个程序进行一些改造,让服务端接收到客户端的信息后,打印到控制台,并响应信息给客户端;客户端也将服务端响应的信息打印到控制台:
//客户端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; public class TcpClient2 { public static void main(String[] args){ try { Socket s = new Socket("127.0.0.1",11012); //发送文本数据给客户端 OutputStream out = s.getOutputStream(); out.write("This's the better TcpClient test Demo".getBytes()); //读取客户端响应信息 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); s.close(); } catch (Exception e) { e.printStackTrace(); } } }
//服务端:
package com.shindo.java.tcp; import java.io.*; import java.net.*; public class TcpServer2 { public static void main(String[] args){ try { //建立服务端,并监听一个端口 ServerSocket ss = new ServerSocket(11012); Socket s = ss.accept(); //获取请求的客户端ip,并打印控制台 String ip = s.getInetAddress().getHostAddress(); System.out.println(ip + "........... is connected"); //获取客户端发送过来的数据,并打印控制台 InputStream in = s.getInputStream(); byte[] buf = new byte[1024]; int len = in.read(buf); System.out.println(new String(buf,0,len)); //发送响应信息给客户端 OutputStream out = s.getOutputStream(); out.write("welcome, client !".getBytes()); s.close(); ss.close(); } catch (Exception e) { e.printStackTrace(); } } }
效果以下:
客户端接收到服务到响应:
服务端接收到客户端发过来的数据: