`
dyllove98
  • 浏览: 1379061 次
  • 性别: Icon_minigender_1
  • 来自: 济南
博客专栏
73a48ce3-d397-3b94-9f5d-49eb2ab017ab
Eclipse Rcp/R...
浏览量:38218
4322ac12-0ba9-3ac3-a3cf-b2f587fdfd3f
项目管理checkList...
浏览量:78433
4fb6ad91-52a6-307a-9e4f-816b4a7ce416
哲理故事与管理之道
浏览量:131597
社区版块
存档分类
最新评论

JAVA之TCP网络通信一个小例子

 
阅读更多

    不积跬步,无以至千里;不积小流,无以成江海。——《荀子劝学》

     PS:这是JAVA课后实验当中的一个小程序,我想总结在这里,以后可以复习一下。

    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》希望在某个不起眼的角落里面发现我的答案。

分享到:
评论

相关推荐

    JAVA读写PLC物联网Modbus RTU Modbus TCP Modbus UDP通信,JAVA与Modbus通信源码

    Modbus允许多个 (大约240个) 设备连接在同一个网络上进行通信,举个例子,一个由测量温度和湿度的装置,并且将结果发送给计算机。Modbus支持的具体协议有:Modbus TCP、Modbus UDP、Modbus RTU、ModbusRtuOverTcp、...

    欧姆龙以太网通讯TCP_UDP例子及欧姆龙PLC程序例子说明.zip

    欧姆龙TCP/UDP网络通讯例子,通讯的每个节点都有详细说明,还有欧姆龙PLC程序例子,以及中文版通讯功能块。

    TCP收发json. 客户端和服务端

    这次是通过tcp收发json的例子。里面的程序应该用qt creator 可以直接运行。

    java源码包---java 源码 大量 实例

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java源码包4

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包3

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    java源码包2

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 ...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    java编程socket通信

    这是个很全面的java写的socket通信,使用套接字实现基于TCP协议的服务器和客户机程序,还有个UDP协议的例子。文档很详细。

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    2个目标文件 摘要:Java源码,文件操作,TCP,服务器 Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    1.6 小结:我们学会了编译和运行一个Java程序! 18 1.7 习题 19 第2章 搭建自己的集成开发环境 20 教学视频:31分钟 2.1 安装集成开发环境 20 2.1.1 集成开发环境有哪些 20 2.1.2 安装Eclipse 21 2.2 Eclipse...

    网络与通信设计实验-客户服务端程序

    网络与通信设计实验 服务端,客户端程序。例子,列车,电影院。

    疯狂JAVA讲义

    1.5 第一个Java程序 12 1.5.1 编辑Java源代码 12 1.5.2 编译Java程序 13 学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不...

    java范例开发大全源代码

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12 ...

    java范例开发大全

    实例1 开发第一个Java程序 7 第2章 Java基础类型与运算符(教学视频:39分钟) 9 2.1 基础类型 9 实例2 自动提升 9 实例3 自动转换 10 实例4 常用基础类型之强制转换 11 2.2 运算符 12 实例5 算术运算符 12 实例6 ...

    Java范例开发大全 (源程序)

     实例1 开发第一个Java程序 7  第2章 Java基础类型与运算符(教学视频:39分钟) 9  2.1 基础类型 9  实例2 自动提升 9  实例3 自动转换 10  实例4 常用基础类型之强制转换 11  2.2 运算符 12  实例5...

Global site tag (gtag.js) - Google Analytics