TCP是一种面向广域网的通信协议,目的是在跨越多个网络通信时,为两个通信端点之间提供一条具有下列特点的通信方式: [1]
(1)基于流的方式;
(2)面向连接;
(3)可靠通信方式;
(4)在网络状况不佳的时候尽量降低系统由于重传带来的带宽开销;
(5)通信连接维护是面向通信的两个端点的,而不考虑中间网段和节点。
Tcp有 安全性高的协议,会确保双方完成连接,再通讯
三次握手(确保连接),四次挥手(确保断开)的特点;
TCP主要使用Socket和IO流进行使用,是建立在客服端与服务端之间交流的法则,Socket和Io流是桥梁。
以下是使用Tcp学习的案例;
建立一个服务端,使三个以上的客户端可以像群聊一样在本地互相通信;
思路是:通过Socket和Io流吧客户端发送的信息保存在服务端的集合中,再通过服务端返回到客户端中;
客户端代码:
package a724; import java.io.*; import java.net.Socket; import java.util.Scanner; public class b { public static void main(String[] args) throws IOException { Socket socket=new Socket("localhost",7666); new Thread(()->{ Scanner scanner=new Scanner(System.in);while (true) { System.out.println("请输入"); String s = scanner.nextLine(); OutputStream outputStream = null; try { outputStream = socket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } try { outputStream.write(s.getBytes()); } catch (IOException e) { e.printStackTrace(); } try { outputStream.write("[over]".getBytes()); } catch (IOException e) { e.printStackTrace(); } if ("exit".equals(s)) {break; } } }).start(); new Thread(()->{ try { InputStream inputStream=socket.getInputStream(); Reader r=new InputStreamReader(inputStream); BufferedReader br=new BufferedReader(r); a: while (true){String s=""; while (true) { int a = br.read(); s += (char) a; if (s.endsWith("[over]")) { s = s.replace("[over]", ""); System.out.println("接收到" +args[0]+ s); continue a; } } } } catch (IOException e) { e.printStackTrace(); } }).start(); } }服务端代码:
package a724; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.Vector; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class a { public static void main(String[] args) throws IOException { ServerSocket socket=new ServerSocket(7666); ThreadPoolExecutor pool=new ThreadPoolExecutor(10,50,50, TimeUnit.SECONDS,new ArrayBlockingQueue<>(1)); List<Socket>list=new Vector<>(); for(int i=0;i<20;i++){pool.execute(()->{ try { Socket socket1=socket.accept();list.add(socket1); InputStream inputStream=socket1.getInputStream(); Reader r=new InputStreamReader(inputStream); BufferedReader br=new BufferedReader(r); a: while (true){String s=""; while (true){ int a= 0; try { a = br.read(); } catch (IOException e) { e.printStackTrace(); } s+=(char)a; if(s.endsWith("[over]")) { s = s.replace("[over]", ""); System.out.println("接收到" + s); for (Socket l : list) { OutputStream outputStream=l.getOutputStream(); outputStream.write(s.getBytes()); outputStream.write("[over]".getBytes()); } continue a; } } } } catch (IOException e) { e.printStackTrace(); });}} );} }
其中遇见的问题:1.使用Vector集合是线程安全的集合,内部原理是上锁;
2.需要添加标识符来告诉客户端向服务端输入完毕,否则会导致线程堵塞;
3.服务端和客户端端口要一致,否则无法尽享行通信
新手小白如有错误请谅解。