Java之TCP网络通信例子

简介:

 JAVA中设计网络编程模式的主要有TCP和UDP两种。

    TCP是属于即时通信,点对点连接进行通信。

    UDP是通过数据包来进行通信,UDP当中就会牵扯到数据的解析和传送。

    在安全性能方面,TCP要略胜一筹,通信过程中不容易出现数据丢失的现象,有一方中断,两方的通信就会结束,UDP数据包传送的过程当中,一方中断,数据包有很大的可能丢失,还有可能传来的数据包的顺序是错乱的;

    在效率方面,UDP要比TCP快的不只是一点点的问题,若终端有解析数据方法的函数,数据包就会源源不断的传送过来,然后反馈回去。

复制代码
public class Server {
    static BufferedReader br; //服务器端的输入流
    static PrintStream ps; //服务器端的输出流
    static JTextArea text; //服务器相关的界面组件

    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类:

复制代码
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 异常,我很不理解?

作者:Orson 
出处:http://www.cnblogs.com/java-class/ 
如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】 
如果,您希望更容易地发现我的新博客,不妨点击一下左下角的【关注我】 
如果,您对我的博客内容感兴趣,请继续关注我的后续博客,我是【Orson】 

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段 声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 

转载:http://www.cnblogs.com/java-class/archive/2012/12/10/2812006.html

目录
相关文章
|
2天前
|
安全 Java 网络安全
深入理解Java异常处理网络安全与信息安全:保护数据的关键策略
【4月更文挑战第29天】本文将深入探讨Java中的异常处理机制,包括异常的概念、分类、捕获和处理等方面。通过详细的解析和实例演示,帮助读者更好地理解Java异常处理的原理和应用。 【4月更文挑战第29天】在数字化时代,数据成为最宝贵的资产之一。随着网络攻击的日益猖獗,了解并实施有效的网络安全和信息保护措施变得至关重要。本文将深入探讨网络安全漏洞的概念、加密技术的重要性以及提升个人和企业的安全意识的必要性。我们将分析当前的安全挑战,并提供一系列实用的防护策略,旨在帮助读者构建一个更加安全的数字环境。
|
2天前
|
网络协议 JavaScript 前端开发
Node.js的网络编程:深入TCP/UDP网络编程
【4月更文挑战第29天】本文介绍了如何在Node.js中进行TCP和UDP网络编程。使用net模块,可以创建TCP服务器和客户端,实现可靠的数据传输。例如,通过`net.createServer()`创建服务器,监听数据、关闭和错误事件。客户端使用`net.createConnection()`连接服务器并通信。另一方面,dgram模块用于UDP编程,创建UDP套接字并绑定端口,通过`server.send()`发送和接收数据报。TCP提供连接和数据可靠性,适合需要顺序和完整性的场景,而UDP更轻量级,适用于实时性要求高的应用。Node.js的网络编程能力使其成为开发高效网络应用的理想选择。
|
4天前
|
网络协议 Java 网络架构
Java基础教程(18)-Java中的网络编程
【4月更文挑战第18天】Java网络编程简化了底层协议处理,利用Java标准库接口进行TCP/IP通信。TCP协议提供可靠传输,常用于HTTP、SMTP等协议;UDP协议则更高效但不保证可靠性。在TCP编程中,ServerSocket用于监听客户端连接,Socket实现双进程间通信。UDP编程中,DatagramSocket处理无连接的数据报文。HTTP编程可以通过HttpURLConnection发送请求并接收响应。
|
7天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
12天前
|
监控 网络协议 Java
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
22 0
《Java 简易速速上手小册》第7章:Java 网络编程(2024 最新版)
|
12天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
13天前
|
JavaScript Java 测试技术
基于Java的网络办公系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络办公系统的设计与实现(源码+lw+部署文档+讲解等)
21 0
|
14天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
16天前
|
JavaScript Java 测试技术
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
27 0
|
16天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。