TCP 的 Java 支持

协议相当于相互通信的程序间达成的一种约定,它规定了分组报文的结构、交换方式、包含的意义以及怎样对报文所包含的信息进行解析,TCP/IP 协议族有 IP 协议、TCP 协议和 UDP 协议。现在 TCP/IP 协议族中的主要 socket 类型为流套接字(使用 TCP 协议)和数据报套接字(使用 UDP 协议)。

Socket套接字 是面向连接的通信,基于TCP/IP协议提供了稳定的支持(Ps: TCP/IP 传输效率低于 UDP),TCP/IP 提供了Socket和Serversocket两个类, 使用 Serversocket 实例来监听端口是否 有客户端请求,并通过 accept()方法 来返回一个Socket 实例,客户端的socket和服务端的socket 就这样建立了连接,每个socket 有自己的io流 ,那么服务端的输入流对应客户端的输出流,客户端的输出流对应服务端的输入流,在这里输入流 我们采用(BufferedReader)包装流,输入采用(PrintStream)包装流,通过包装流 包装 输入输初流,可以方便程序数据的使用。

典型的 TCP 服务端执行如下两步操作:

创建一个 ServerSocket 实例并指定本地端口,用来监听客户端在该端口发送的 TCP 连接请求;

  1. 重复执行:

  • 调用 ServerSocket 的 accept()方法以获取客户端连接,并通过其返回值创建一个 Socket 实例;

  • 为返回的 Socket 实例开启新的线程,并使用返回的 Socket 实例的 I/O 流与客户端通信; 通信完成后,使用 Socket 类的 close()方法关闭该客户端的

套接字连接。

好了话不多说,下面贴程序。

***服务端代码***

 1 package socket多客户端; 2  3  4 import java.io.IOException; 5 import java.net.*; 6 import java.util.ArrayList; 7 public class Server { 8      9     private static ArrayList<Thread_Client> list = new ArrayList<>();10     11     private static final int PORT = 6789;12     private static ServerSocket serverSocket;13     private static Socket socket;14     15     static void send(String string){16         17         // 使用 for 循环 , 遍历Arraylist 广播某客户端传来的消息18         for(Thread_Client thread_Client : list){19             //  调用 子线程的 send 方法20             thread_Client.send(string);21         }22         23     }24     25     26     public static void main(String[] args) {27         28         29         30         System.out.println("服务端开始运行...");31         32         try {33             34             serverSocket = new ServerSocket(PORT);35             36             while(true){37                 socket = serverSocket.accept();38                 Thread_Client thread_Client = new Thread_Client(socket);39                 thread_Client.start();40                 System.out.println("已连接!");41                 list.add(thread_Client);42                 43             }44             45             46         } catch (Exception e) {47             // TODO: handle exception48             System.out.println("服务端异常1");49         }finally {50             51             try {52                 socket.close();53                 serverSocket.close();54                 55             } catch (IOException e2) {56                 // TODO: handle exception57                 System.out.println("服务端异常2");58             }59             60         }61         62     }63 64 }

*** 然后是 处理连接后socket 的子线程***

 1 package socket多客户端; 2  3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 import java.io.PrintStream; 7 import java.lang.*; 8 import java.net.Socket; 9 10 public class Thread_Client  extends Thread{11     12     private BufferedReader bufferedReader = null;13     private PrintStream printStream = null;14     15     Socket socket;16     17     public Thread_Client(Socket socket) {18         //19         this.socket = socket;20     }21 22     @Override23     public void run() {24         // TODO Auto-generated method stub25         super.run();26         27         try {28             Get_Set(socket);29             30         } catch (Exception e) {31             // TODO: handle exception32             System.out.println("异常1");33         }34         35     }36     37     public void send(String string){38         if(string != null){39             printStream.println(string);40             printStream.flush();41         }42     }43     44     public void Get_Set(Socket socket){45         46         try {47             bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));48             printStream = new PrintStream(socket.getOutputStream());49             50             Boolean flag = true;51             while(flag){52                 String string = bufferedReader.readLine();53                 if("".equals(string) || string == null){54                     flag = false;55                 }else{56                     if("end".equals(string)){57                         flag = false;58                     }else{59                         System.out.println("read : " + string);60                         //调用 主线程 广播61                         Server.send(string);62                     }63                 }64             }65             66         } catch (IOException e) {67             // TODO: handle exception68             System.out.println("异常2");69         }70     }71     72 }

*** 最后是 客户端代码 ***

  1 package socket多客户端;  2   3 import java.io.*;  4 import java.net.*;  5 import java.util.Scanner;  6   7 public class Client {  8       9      10     private static Socket socket; 11     private static BufferedReader bufferedReader; 12     private static PrintStream printStream; 13      14     //  将 读服务端数据封装在 Client—read 方法里 15     public static void Client_read(Socket socket){ 16         // 匿名内部类 开 一个子线程 17         new Thread(new Runnable() { 18             private BufferedReader bufferedReader_ec; 19              20             @Override 21             public void run() { 22                 // TODO Auto-generated method stub 23                  24                 try { 25                     bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 26                     String str = bufferedReader.readLine(); 27                     if("".equals(str) || str == null || "end".equals(str)){ 28                          29                     }else{ 30                         System.out.println(str); 31                     } 32                      33                 } catch (Exception e) { 34                     // TODO: handle exception 35                 } 36             } 37         }).start(); 38     } 39      40     //  Get_Set 方法 处理 客户端与服务端 数据的读写 41     static void Get_Set(Socket socket){ 42          43         try { 44             bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); 45             printStream = new PrintStream(socket.getOutputStream()); 46             Scanner keyboard = new Scanner(System.in); 47              48             Boolean flag = true; 49             while(flag){ 50                  51                 // 在这里调用 之前封装的 Client_read 方法 52                 Client_read(socket); 53          54                 //  从 键盘 输入数据 55                 String shuru = keyboard.nextLine(); 56                 if("".equals(shuru) || shuru == null){  57                     flag = false;                     //  通过 嵌套if else  筛掉无用值 58                 }else{ 59                     if("end".equals(shuru)){ 60                         flag = false; 61                     }else{ 62                         printStream.println(shuru);    // 发送至服务端 63                         printStream.flush(); 64                     } 65                 } 66                  67                  68             } 69              70              71         } catch (Exception e) { 72             // TODO: handle exception 73         } 74          75          76     } 77      78     public static void main(String[] args) { 79          80         try { 81              82             socket = new Socket("localhost",6789); 83             System.out.println("客户端已连接至服务端!"); 84             Get_Set(socket); 85              86         } catch (Exception e) { 87             // TODO: handle exception 88             System.out.println("客户端异常1"); 89         }finally { 90             try { 91                 printStream.close(); 92                 bufferedReader.close(); 93                 socket.close(); 94                  95             } catch (Exception e2) { 96                 // TODO: handle exception 97                 System.out.println("客户端异常2"); 98             } 99         }100         101         102     }103     104 105 }

好了 ,下面我们来运行 看看结结果。

第一个控制台是 服务端

第二个控制台是 客户端1

第三个控制台是 客户端2

这样我们就实现了 一个简单的基于TCP/IP协议的socket多客户端通信。

转载于:https://blog.51cto.com/12902932/1925685

JAVA-Socket通信笔记相关推荐

  1. flex java socket通信

    引用:http://developer.51cto.com/art/201003/189791.htm Java socket通信如何进行相关问题的解答呢?还是需要我们不断的学习,在学习的过程中会遇到 ...

  2. Java Socket通信实现多人多端网络画板聊天室

    老规矩,先上实现的效果展示! Java Socket通信实现多人多端网络画板聊天室 本文介绍了一个基于Socket实现网络画板聊天室的完整过程,聊天室具备多人文本对话.同步绘图等功能. 初尝试 Soc ...

  3. Java Socket通信之TCP协议

    文章目录 一. Java流套接字通信模型 1.TCP模型 2.TCP Socket常见API ServerSocket API Socket API 二.TCP流套接字编程 1.回显服务器 2.多线程 ...

  4. java socket通信

    socket通信是指两台计算机的两个程序之间的通信,双向链路的每一端都称为一个socket,但分为客户机和服务器. java.net提供了ServerSocket和Socket类,分别用于服务器和客户 ...

  5. java Socket通信(一)

    ava socket通信已经被封装好了主要使用两个类ServerSocket 和Socket 首先写一个1v1的通信 服务端 /** * */ package com.dnion.socket; im ...

  6. Java Socket 通信实例 - 转载

    基于Tcp协议的简单Socket通信实例(JAVA) 好久没写博客了,前段时间忙于做项目,耽误了些时间,今天开始继续写起~ 今天来讲下关于Socket通信的简单应用,关于什么是Socket以及一些网络 ...

  7. java socket通信 客户端_JavaのSocket编程之简单客户端与服务器端通信

    Socket编程之简单客户端与服务器端通信 socket 通常用来实现客户端和服务端的连接,socket 是Tcp/Ip协议的一个十分流行的编程界面,一个socket 由一个Ip地址和一个端口号唯一确 ...

  8. c与java socket通信

    通常情况下是java调用so库,调用协议好的方法传参,然后获取返回值 现要求java文件与c文件进行socket通信,可互为服务端和客户端,具体示例如下: GitHub - zpbshine/Sock ...

  9. java socket通信的简要举例

    Java的原生Socket(java.net.Socket)通信的举例: 首先是创建Socket的服务端:其次创建Socket的客户端. 通信过程如下: 客户端(C)向服务端(S)发送任意数据,服务端 ...

  10. Java——Socket通信原理

    * Socket通信原理图解* A:Socket(中文翻译为:电源插座)套接字概述* 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识套接字* 通信的两端都有Socket(两端都 ...

最新文章

  1. 微软以后要是也开源也免费,java还竞争过.NET吗?
  2. 博客域名改为http://bobli.cnblogs.com
  3. php css下划线,如何自定义下划线的样式
  4. /dev/console,/dev/tty 和 /dev/null
  5. 战棋类中实现的移动范围
  6. 学习笔记----周志华《机器学习》第五章(神经网络)(一)
  7. 【leetcode❤python】 9. Palindrome Number
  8. php 盾灵新闻系统,代码审计 | 记一次盾灵系统审计从后台到Getshell
  9. ActiveMQ学习总结(4)——业界消息队列简介
  10. 国科微电子:芯片将是国内企业下一个发力点
  11. web javascript开发 之Response.Write 与document.writ...
  12. 编译android源码的make命令解析
  13. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_4字符输出流的基本使用_写出单个字符...
  14. [Devcpp]为Devc自定义编译器及Devcpp路径读取的Bug
  15. 2017百度之星资格赛 1001/hdu 6080 度度熊保护村庄
  16. matlab读取txt函数,matlab读取txt某一行
  17. java长连接转短连接
  18. 数学基础(二)——参数估计与矩阵运算基础
  19. excel自动换行_你会用Excel制作 流程图 吗?
  20. 电源管理芯片LDO(Low Dropout Regulator)分析1

热门文章

  1. 魔兽世界服务器位面 稳定,因抗议《魔兽世界》位面技术在RP服务器中被取消
  2. yii2 后台权限验证获取用户身份_Yii2搭建后台并实现rbac权限控制完整实例教程...
  3. Java项目:酒店管理系统(java+Springboot+Mybatis+Beetl+Layui)
  4. mysql 5.6.15_mysql-5.6.15-win32.zip免安装配置
  5. 【jsp】使用get方法传值的格式
  6. Springboot结合 framework 加载静资源 出现404 问题解决 记录
  7. python 进程池 freeze_support_Python 多进程并发操作中进程池Pool的实例
  8. 小程序在canvas上层做图片滚动
  9. 云开发地图标记导航 云开发一次性取所有数据
  10. iOS传感器:实现一个随屏幕旋转的图片