TCP/UDP 协议

通俗解释:

TCP协议和UDP协议的区别类似于电话系统和邮政系统。

<1>TCP:类似于电话系统,建立双向的通信通道,确定连接,话音顺序接听

<2>UDP:类似于邮政系统,发送方将信件发送到正确的地址,但并不知道准确的邮路,大多数邮件到达了目的地,个别情况一些邮件会在路上丢失。邮件不保证顺序到达目的地。

TCP套接字

Socket

  客户端的通信套接字,可指定远端IP地址、端口进行连接通信,也可以通过方法获取已连接的socket的远端IP地址、端口,以及将此socket以字节输入流和输出流的形式返回,当与数据输入流和输出流绑定,便可实现客户端的网络通信。

  构造函数均为public修饰类型,如果创建socket时发生I/O错误,均抛出IOException异常。常用构造函数如下:

Socket(InetAddress address,int port):创建一个socket并与规定的IP地址的指定的端口相连接。

Socket(String host,int port):创建一个socket并与指定主机的指定端口连接。

ServerSocket

服务器的通讯套接字,用来侦听客户端请求的连接,并为每个新连接创建一个socket对象,由此创建绑定此socket的输入流和输出流,与客户端实现网络通信。

   构造函数均为public修饰类型,如果创建socket时发生I/O错误,均抛出IOException异常。常用构造函数如下:

   ServerSocket(int port):在所给定的用来侦听的端口上建立一个服务器套接字。如果端口号为0,则在任意的空闲的端口上建立要给服务器套接字。外来连接请求的数量默认最大为50。

多线程聊天室实例

服务端Cilent

  创建ServerSocket并监听设置的端口,调用accpet()方法,直到找到对应的socket与之连接,创建一个线程为止服务。

   Launch the Application 部分为Java Swing的窗口部分。

public class ServerCilent {private JFrame frmServer;private JTextField textField;private JTable table;private JLabel lblNewLabel;private JButton btnRefresh;private JButton btnListenstart;private SocketManager SocketArr=new SocketManager();//创建 Server端void getServer(int port){try {ServerSocket serverSocket=new ServerSocket(port);System.out.println("已经开启服务端");while(true){Socket socket=serverSocket.accept();new W_Thread(socket).start();SocketArr.add(socket);SocketArr.sendClientInfo();}} catch (Exception e) {// TODO: handle exception
                e.printStackTrace();}}class W_Thread extends Thread{Socket socket=null;private BufferedReader reader;private PrintWriter writer;public W_Thread(Socket socket){this.socket=socket;}public void run(){try {reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));writer=new PrintWriter(socket.getOutputStream(),true);String msg;while((msg=reader.readLine())!=null ){System.out.println(msg);SocketArr.SendtoAll(msg);}} catch (Exception e) {// TODO: handle exception
                e.printStackTrace();}}}/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {ServerCilent window = new ServerCilent();window.frmServer.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the application.*/public ServerCilent() {initialize();}/*** Initialize the contents of the frame.*/private void initialize() {frmServer = new JFrame();frmServer.setResizable(false);frmServer.setTitle("ServerCilent");frmServer.setBounds(100, 100, 452, 371);frmServer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frmServer.getContentPane().setLayout(null);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(null, "DefaultSetting", TitledBorder.LEADING, TitledBorder.TOP, null, null));panel.setBounds(10, 10, 414, 66);frmServer.getContentPane().add(panel);panel.setLayout(null);JLabel lblPort = new JLabel("Port:");lblPort.setBounds(10, 25, 54, 15);panel.add(lblPort);textField = new JTextField();textField.setBounds(48, 22, 122, 21);panel.add(textField);textField.setColumns(10);btnListenstart = new JButton("Listen&Start");btnListenstart.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent arg0) {int port=Integer.parseInt(textField.getText());ServerCilent serverCilent=new ServerCilent();serverCilent.getServer(port);textField.setEditable(false);btnListenstart.setVisible(false);}});btnListenstart.setBounds(254, 21, 136, 23);panel.add(btnListenstart);JLabel label = new JLabel("在线人数:");label.setBounds(10, 298, 82, 15);frmServer.getContentPane().add(label);lblNewLabel = new JLabel(String.valueOf(SocketArr.size()));lblNewLabel.setBounds(75, 298, 54, 15);frmServer.getContentPane().add(lblNewLabel);btnRefresh = new JButton("Refresh");btnRefresh.setBounds(331, 298, 93, 23);frmServer.getContentPane().add(btnRefresh);}
}

多线程客户端Cilent

创建Socket,并获取对应的输入输出流即可。

public class Cilent implements Runnable{/*Swing*/private JFrame frmLogincilent;private JTextField IPAdress;private JTextField Port;private JTextField Nickname;private JTextField Sendinfo;private JButton Sumbit;private JTextArea ShowArea;private JButton Send;/*Stream*/private BufferedReader reader;private PrintWriter writer;@Overridepublic void run(){while(true){try {ShowArea.append(reader.readLine()+"\n");} catch (Exception e) {// TODO: handle exception
            }}}public void Create_Socket(InetAddress ip,int port){ShowArea.append("正在尝试连接到服务端…… ……"+"\n");try {Socket socket=new Socket(ip, port);ShowArea.append("聊天室已经准备好");frmLogincilent.setTitle("Ip:"+ip+"   Port:"+port+"   已连接在线");reader=new BufferedReader(new InputStreamReader(socket.getInputStream()));writer=new PrintWriter(socket.getOutputStream(),true);new Thread(this).start();} catch (Exception e) {// TODO: handle exception
        }}/*** Launch the application.*/public static void main(String[] args) {EventQueue.invokeLater(new Runnable() {public void run() {try {Cilent window = new Cilent();window.frmLogincilent.setVisible(true);} catch (Exception e) {e.printStackTrace();}}});}/*** Create the application.*/public Cilent() {initialize();}/*** Initialize the contents of the frame.*/private void initialize() {frmLogincilent = new JFrame();frmLogincilent.setResizable(false);frmLogincilent.setTitle("Cilent");frmLogincilent.setBounds(100, 100, 458, 532);frmLogincilent.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frmLogincilent.getContentPane().setLayout(null);JPanel panel = new JPanel();panel.setBorder(new TitledBorder(null, "Default Setting", TitledBorder.LEADING, TitledBorder.TOP, null, null));panel.setBounds(10, 10, 424, 84);frmLogincilent.getContentPane().add(panel);panel.setLayout(null);JLabel lblIpAdress = new JLabel("IP Adress:");lblIpAdress.setBounds(10, 20, 73, 15);panel.add(lblIpAdress);IPAdress = new JTextField();IPAdress.setBounds(82, 17, 142, 21);panel.add(IPAdress);IPAdress.setColumns(10);JLabel lblProt = new JLabel("Prot:");lblProt.setBounds(10, 48, 54, 15);panel.add(lblProt);Port = new JTextField();Port.setBounds(82, 45, 66, 21);panel.add(Port);Port.setColumns(10);JLabel lblNickname = new JLabel("NickName:");lblNickname.setBounds(170, 48, 73, 15);panel.add(lblNickname);Nickname = new JTextField();Nickname.setBounds(238, 45, 176, 21);panel.add(Nickname);Nickname.setColumns(10);Sumbit = new JButton("Lock&Login");Sumbit.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent arg0) {try {/*Create Socket*/String ipString=IPAdress.getText();int port=Integer.parseInt(Port.getText());String Name=Nickname.getText();InetAddress ip=InetAddress.getByName(ipString);Create_Socket(ip, port);/*Swing*/IPAdress.setEditable(false);Port.setEditable(false);Nickname.setEditable(false);Sumbit.setVisible(false);} catch (Exception e) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, "invalid data");}}});Sumbit.setBounds(272, 16, 142, 23);panel.add(Sumbit);ShowArea = new JTextArea();ShowArea.setBounds(10, 104, 424, 358);frmLogincilent.getContentPane().add(ShowArea);Sendinfo = new JTextField();Sendinfo.setBounds(10, 472, 330, 21);frmLogincilent.getContentPane().add(Sendinfo);Sendinfo.setColumns(10);Send = new JButton("Send");Send.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent arg0) {writer.println(Nickname.getText()+":"+Sendinfo.getText());Sendinfo.setText("");}});Send.setBounds(349, 471, 85, 23);frmLogincilent.getContentPane().add(Send);}
}

Socket管理类

继承ArrayList,并添加发送的方法SendtoAll(),以及显示当前连接数目的方法SendCilentInfo()

public class SocketManager extends ArrayList{synchronized void add(Socket x){super.add(x);}synchronized void remove(Socket x){super.remove(x);}synchronized void SendtoAll(String str){PrintWriter writer=null;Socket socket;for(int i=0;i<size();i++){socket=(Socket)get(i);try {writer=new PrintWriter(socket.getOutputStream(),true);if(writer!=null){writer.println(str);}} catch (Exception e) {// TODO: handle exception
                e.printStackTrace();}}}synchronized void sendClientInfo(){String info="当前位于聊天室的人数为"+size();System.out.println(info);SendtoAll(info);}}

示例效果:

转载于:https://www.cnblogs.com/rekent/p/6920440.html

Java TCP通信概念及实例相关推荐

  1. java -TCP通信

    TCP通信 TCP通信同UDP通信一样,都能实现两台计算机之间的通信,通信的两端都需要创建socket对象. 区别在于,UDP中只有发送端和接收端,不区分客户端与服务器端,计算机之间可以任意地发送数据 ...

  2. java线程通信概念_java基础线程总结(线程概念、线程创建方式、线程间通信、线程重要方法)...

    基础篇之<线程> @author :kern ---------------------------------------------------------------- 一:进程:是 ...

  3. JAVA TCP通信练习

    2019独角兽企业重金招聘Python工程师标准>>> 1.Server端 package com.hhdys.serviceimpl;import java.io.*; impor ...

  4. java tcp 编程实例_Java实现基于TCP的通讯程序实例解析

    Java中的TCP通信程序 TCP可以实现两台计算机之间的数据交互通信的两端,要严格区分客户端与服务端 两端通信时的步骤: 1.服务端程序,需要事先启动,等待客户端连接 2.客户端主动连接服务器端,才 ...

  5. JAVA SE学习day_08:TCP通信、多线程(并联)

    为了解决在程序中不同客户端在同一服务端中都可以进行数据发送的情况,要使用多线程将其进行并联操作 一.多线程 线程可以并发执行多个代码片段,使得这些代码片段直接运行是互不干涉的: 创建线程有两种方式, ...

  6. JAVA SE学习day_07:异常处理、TCP通信

    一.异常中常见的方法 public static void main(String[] args) {System.out.println("程序开始了");try {String ...

  7. java tcp read_【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子--反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 书上的服务器 ...

  8. 【Java TCP/IP Socket】TCP Socket通信中由read返回值造成的的死锁问题(含代码)(转)...

    书上示例 在第一章<基本套接字>中,作者给出了一个TCP Socket通信的例子--反馈服务器,即服务器端直接把从客户端接收到的数据原原本本地反馈回去. 书上客户端代码如下: 1 2 3 ...

  9. tcp网络通信教程 java_基于java TCP网络通信的实例详解

    JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送.在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数 ...

最新文章

  1. 【alibaba-cloud】Gateway网关
  2. php渲染页面简单例子,微信小程序如何渲染html内容(示例讲解)
  3. Linux命令 查看文件中指定行号的内容
  4. MYSQL中什么是规范化_如何规范化SQL数据库
  5. Windows命令查看文件MD5
  6. python selenuim使用代理的方式
  7. 重新复习基础草稿:迭代器的使用
  8. fw150um无线网卡linux驱动,fw150um无线网卡驱动
  9. 跨平台 H264 H265/HEVC 编解码 硬件加速
  10. 如何卸载mingw_MinGW和MSYS的自动安装
  11. 您选择的分区不支持无损调整容量操作
  12. LCD 液晶显示器 ---------- LTDC 控制器
  13. “封号斗罗”程序员修炼之道:通向务实的最高境界
  14. QGIS绿色版工具坐标系设置
  15. 诺基亚N95手机使用技巧
  16. zbb20181210 CentOS第一次安装MySQL的完整步骤
  17. C#mdi 建立多窗口
  18. java文档注释生产api没有注释_如何使用javadoc命令生成api文档,文档注释
  19. Revit二次开发中如何创建结构平面,修改结构平面的视图范围
  20. DHCP 和 DHCP-Realy 功能演示完整示例

热门文章

  1. 管理对象空间——管理存储参数
  2. Apache 服务器的安全策略
  3. 用PHP调用WEBSERVICE
  4. php7版本一句话木马,一句话查找 PHP 木马
  5. 8-字符串的压缩存储
  6. 韩国央行行长李柱烈:加密货币的波动给金融稳定带来风险
  7. Coinlist将在4月1日到3日举行Rally(RLY)代币销售
  8. 赛锐信息:SAP ABAP 概述
  9. 有没有人告诉你联合贷款的这些细则
  10. 智慧环卫、智慧公厕、智能抽样、综合指挥中心、质量监察、指挥调度、车辆监管、收运计划、垃圾中转站、考核管理、垃圾收运、机械化保洁作业、环卫作业、油耗空驶、环卫设施、人工保洁作业、稽查扣分、Axure