TCP通信协议特点:
1、tcp协议是基于IO流进行数据的传输,是面向链接的。
2、tcp进行数据传输的时候,数据没有大小限制的。
3、面向链接,通过三次握手的机制,保证数据的完整性,是一个可靠的协议。
4、tcp面向连接,所以速度稍微慢一点。
5、TCP是区分客户端和服务端的。
三次握手机制:保证网络畅通
比如说,打电话,QQFeiQ的文件传输,迅雷下载等
TCP通信要掌握Socket相关的两个类
Socket(客户端类):一旦启动马上要与服务端进行建立连接,一般需要传参:服务器的Address和需要端口
SeverSocket(服务端类)
tcp的客户端使用步骤:
1、建立我们tcp的客户端的服务
2、获取大对应的流对象。
3、写出或读取数据
4.关闭资源
1 public class Demo1Client 2 { 3 public static void main(String[] args) throws IOException, IOException 4 { 5 //建立tcp的服务 6 Socket socket = new Socket(InetAddress.getLocalHost(), 9090); 7 //获取对应的输出流对象 8 OutputStream outputStream = socket.getOutputStream(); 9 //利用输出流对象把数据写出即可 10 outputStream.write("服务端你好呀".getBytes()); 11 12 //获取到一个输入流,读取服务端会送的数据 13 InputStream inputStream = socket.getInputStream(); 14 int length = 0; 15 byte[] buf = new byte[1024]; 16 length = inputStream.read(buf); 17 System.out.println("这是客户端接收到的数据:"+new String(buf, 0, length)); 18 19 //关闭资源 20 socket.close(); 21 } 22 }
SeverSocket的使用步骤
1、建立服务端的服务并且监听端口。
2、接受客户端的链接,产生一个socket。
3、获取对应的流对象,读取或写出数据。
4、关闭资源。
1 public class Demo1Server 2 { 3 public static void main(String[] args) throws Exception 4 { 5 //建立TCp的服务端,监听一个端口 6 ServerSocket serverSocket = new ServerSocket(9090); 7 //接受客户端的链接 8 Socket socket = serverSocket.accept();//aacept() 接受客户端的链接,也是一个阻塞性的方法,没有客户端与之连接时,将一直处于阻塞状态 9 //获取输入流对象,读取客户端发型内容 10 InputStream inputStream = socket.getInputStream(); 11 byte[] buf = new byte[1024]; 12 int length = 0; 13 length = inputStream.read(buf); 14 System.out.println("服务端接受到:"+new String(buf, 0, length)); 15 16 Thread.sleep(600); 17 18 //获取socket输出流对象,向发送端发出数据 19 OutputStream outputStream = socket.getOutputStream(); 20 outputStream.write("客户端你要呀,我收到了".getBytes()); 21 22 //关闭资源 23 serverSocket.close(); 24 } 25 }
还是应当先启动服务端,这个样子运行客户端的时候才能有地方链接。
示例:基于TCP的一问一答的聊天:
1 //聊天客户端 2 public class ChatSender { 3 public static void main(String[] args) throws IOException{ 4 //建立tcp的客户端的服务 5 Socket socket = new Socket(InetAddress.getLocalHost(), 9090); 6 //取出socket的输出流,底层操作的是字节流,我们应当使用的是字符流 所以需要使用 输出字节流的转换流 7 OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream()); 8 //获取socket的输入流的对象 9 BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 10 11 //获取键盘的输入流对象 一行行的读取数据 12 BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in)); 13 String line = null; 14 //不断的读取键盘录入的数据,并不断的把数据写出 15 while((line = keyReader.readLine())!=null) 16 { 17 //直接写出数据 18 socketOut.write(line+" "); //这里书名一下为什么要" "因为readline读取的是一行只有当讲到" "的时候才会换行 19 socketOut.flush(); //凡是带有字符读取的都有 缓存 有缓存的就要使用flush方法 20 21 //读取服务端回送的数据 22 line = socketReader.readLine(); 23 System.out.println("服务端的数据:"+line); 24 25 } 26 //关闭资源 27 socket.close(); 28 } 29 } 30 //聊天的服务器端 31 public class ChatServer { 32 public static void main(String[] args) throws IOException{ 33 //建立tcp的服务器端 biang监听接口 34 ServerSocket serverSocket = new ServerSocket(9090); 35 //接受客户端的客户端的链接 产生一个socket 为下面的接受数据做准备 36 Socket socket = serverSocket.accept(); 37 //获取得到socket的输入流对象 38 BufferedReader socketReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 39 40 //获取到socket的输出流对象 41 OutputStreamWriter socketOut = new OutputStreamWriter(socket.getOutputStream()); 42 43 //获取建安的输入流对象 44 BufferedReader keyReader = new BufferedReader(new InputStreamReader(System.in)); 45 46 //读取客户端发送的数据 47 String line = null; 48 while((line = socketReader.readLine())!=null) 49 { 50 System.out.println("客户端 的数据:"+line); 51 System.out.println("请输入回送数据"); 52 line = keyReader.readLine(); 53 socketOut.write(line+" "); 54 socketOut.flush(); 55 } 56 //资源 57 serverSocket.close(); 58 } 59 }