热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

基于javaTCP网络通信的实例详解

本篇文章是对java中TCP网络通信的实例进行了详细的分析介绍,需要的朋友参考下
JAVA中设计网络编程模式的主要有TCP和UDP两种,TCP是属于即时通信,UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送。在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数据丢失的现象,有一方中断,两方的通信就会结束,UDP数据包传送的过程当中,一方中断,数据包有很大的可能丢失,还有可能传来的数据包的顺序是错乱的;在效率方面,UDP要比TCP快的不只是一点点的问题,若终端有解析数据方法的函数,数据包就会源源不断的传送过来,然后反馈回去。
以上都是我自己的理解,下面是关于TCP协议通信的两个类;
Server类:
代码如下:

package TCP;
import java.io.*;
import java.net.*;
import javax.swing.*;
 public class Server {
     //服务器端的输入流
    static  BufferedReader br;
     //服务器端的输出流
    static  PrintStream ps;
     //服务器相关的界面组件
    static  JTextArea text;   
            JFrame frame;

    public Server(){
        //服务器端的界面的实例化
        JFrame frame=new JFrame("服务器端");
        text=new JTextArea();
        JScrollPane scroll =new JScrollPane(text);
        frame.add(scroll);
        frame.setVisible(true);
        frame.setSize(300,400);
        //这里设置服务器端的文本框是不可编辑的
        text.setEditable(false);
    }

    public static void main(String[] args) throws Exception{      
        new Server();    //生成服务器界面
        //通过服务器端构造函数  ServerSocket(port) 实例化一个服务器端口
        ServerSocket server=new ServerSocket(2000);
        text.append("监听2000端口"+"\n");
        //实例化一个接受服务器数据的对象
        Socket client=server.accept();
        br =new BufferedReader(new InputStreamReader(client.getInputStream()));
        ps =new PrintStream(client.getOutputStream());       
        String msg;
        //如果输入流不为空,将接受到的信息打印到相应的文本框中并反馈回收到的信息
        while ((msg =br.readLine())!=null) 
        {
            text.append("服务器端收到:"+msg+"\n");
            ps.println(msg);
            if(msg.equals("quit"))
            {  
                text.append("客户端“2000”已退出!"+"\n");
                text.append("服务器程序将退出!");               
                break;
            }
        }
        ps.close();
        br.close();
        client.close();
    }
}

Client类:
代码如下:

package TCP;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.*;
import java.net.*;
public class Client implements ActionListener{
   //这里有两个图形界面,一个是连接的frame,另一个和服务器通信的界面frame1   
    private  JFrame frame;
    private  JLabel adress;
    private  JLabel port;
             JTextField adresstext;
             JTextField porttext;
             JButton connect;

    private JFrame frame1;
    private JLabel shuru;
    private JPanel panel1;
    private JPanel panel2;
    private JLabel jieshou;
            JButton send;
    static JTextArea shurukuang;
    static TextArea jieshoukuang;

    //从服务端接受的数据流
    static BufferedReader br1;
    //从客户端输出的数据流
    static PrintStream ps;
    //从通信界面中的输入框接受的数据流
    static BufferedReader br2;
    static Socket client;
    //将输入框字符串转换为字符串流所需的字符串的输入流
    static ByteArrayInputStream stringInputStream ;

   public Client() {
       //连接界面的实例化
        frame=new JFrame();
        adress=new JLabel("IP 地址");
        port =new JLabel("端口号");
        adresstext=new JTextField("127.0.0.1",10);
        porttext=new JTextField("2000",10);
        cOnnect=new JButton("连接");
            //连接界面的布局          
        frame.setLayout(new FlowLayout());
        frame.add(adress);
        frame.add(adresstext);
        frame.add(port);  
        frame.add(porttext);
        frame.add(connect);
        frame.setVisible(true);
        frame.setSize(200,150);          
        connect.addActionListener(this);
          //通信界面的实例化
        frame1=new JFrame();
        shuru=new JLabel("请输入");
          shurukuang=new JTextArea("请输入····",5,40); 

          panel1=new JPanel();
          panel1.add(shuru);
          panel1.add(shurukuang);
          panel1.setLayout(new FlowLayout());

          send=new JButton("发送");
          panel2=new JPanel();
          jieshou=new JLabel("已接受");

         jieshoukuang=new TextArea(8,60);    
          jieshoukuang.setEditable(false);

          panel2.add(jieshou);
          panel2.add(jieshoukuang);
          panel2.setLayout(new FlowLayout());       
          frame1.setLayout(new FlowLayout());
              //通信界面都的布局
          frame1.add(BorderLayout.NORTH,panel1);
          frame1.add(send);
          frame1.add(BorderLayout.SOUTH,panel2);
             //连接时通信界面是处于看不到的
          frame1.setVisible(false);
          frame1.setSize(500,350);
          send.addActionListener(this); 
            }
         //两个界面当中都有相应的按钮时间,为相应的时间添加动作
      public  void  actionPerformed(ActionEvent e) {
         if(e.getSource()==connect){   
          try {
                  //当触发连接按钮时,实例化一个客户端
                client=new Socket("127.0.0.1",2000);   
                  //隐藏连接界面,显示通信界面
                frame.setVisible(false);
                frame1.setVisible(true);
                jieshoukuang.append("已经连接上服务器!"+"\n");           
           } catch (IOException e1){
                 System.out.println("链接失败!");
                e1.printStackTrace();
             }
         }
         //通信界面中的发送按钮相应的时间处理
        if(e.getSource()==send){
              //将输入框中的字符串转换为字符串流
             stringInputStream = new ByteArrayInputStream((shurukuang.getText()).getBytes());
             br2 =new BufferedReader(new InputStreamReader(stringInputStream));
             String msg;
             try{
              while((msg=br2.readLine())!=null){   
                  ps.println(msg);   //将输入框中的内容发送给服务器端       
                  jieshoukuang.append("向服务器发送:"+msg+"\n");
                  jieshoukuang.append("客户端接受相应:"+br1.readLine()+"\n");
                  if(msg.equals("quit"))
                     {
                        jieshoukuang.append("客户端将退出!");
                        br1.close();
                        ps.close();
                        client.close();
                        frame1.setVisible(false);
                        break;
                           }                     
                      }   
             }catch(IOException e2){
                 System.out.println("读输入框数据出错!");                 
              }
             shurukuang.setText("");
          }
      } 

      public static void main(String[] args) throws IOException{
           new Client();  //实例化连接界面
           client=new Socket("127.0.0.1",2000);            
           //从服务端接受的数据 
           br1=new BufferedReader(new InputStreamReader(client.getInputStream()));
            //从客户端输出的数据
           ps =new PrintStream(client.getOutputStream());         
              }
        }

写完这两个类以后还是有几个问题:
1)main 函数为什么非要用 static 来修饰?
2)缓冲对象 BufferedReader 为什么不能直接用于判断,非要将读到的数据赋值给字符串来进行操作?
3)在连接界面当中的 Connect 按钮事件 当中我有实例化一个 客户端的对象,但是我注释掉主函数当中 client=new Socket("127.0.0.1",2000); 的这一句的时候,就会发现抛出 NULLPOINTEXCEPTION 异常,我很不理解?
希望有看到这文章的大牛们能不吝赐教,我也正在不停的翻着《Think in java》希望在某个不起眼的角落里面发现我的答案。

推荐阅读
  • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
  • 本文介绍如何在现有网络中部署基于Linux系统的透明防火墙(网桥模式),以实现灵活的时间段控制、流量限制等功能。通过详细的步骤和配置说明,确保内部网络的安全性和稳定性。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 本文深入探讨了MAC地址与IP地址绑定策略在网络安全中的应用及其潜在风险,同时提供了针对该策略的破解方法和相应的防御措施。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 解决MongoDB Compass远程连接问题
    本文记录了在使用阿里云服务器部署MongoDB后,通过MongoDB Compass进行远程连接时遇到的问题及解决方案。详细介绍了从防火墙配置到安全组设置的各个步骤,帮助读者顺利解决问题。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
author-avatar
四木子1982
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有