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

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

Java 网络通信【01】TCP的更多相关文章

  1. Java 网络通信(TCP/UDP)

    1.InetAdress类 与  Socket类  >InetAdress  >Socket 2.TCP/IP协议簇  客户端: 创建 Socket:根据指定服务端的 IP 地址或端口号构 ...

  2. java网络通信:TCP协议

    面试的时候,面试官由于需要考察一个面试人对于网络编程的熟悉程度,往往会考察学生对于TCP.HTTP.UDP.这些常见的网络编程当中的协议的了解程度,而TCP协议则是首当其冲的,作为进程之间通信常用的一 ...

  3. Java中的TCP/UDP网络通信编程

    127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...

  4. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

  5. java网络通信:异步非阻塞I/O (NIO)

    转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...

  6. java多线程实现TCP网络Socket编程(C/S通信)

    目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...

  7. Java学习01

    Java学习01 第一章 1.JRE与JDK JDK(JAVA Develop Kit,JAVA开发工具包)提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者; J ...

  8. java学习之tcp与udp的实现

    package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...

  9. [Java 教程 01] Hello,Java!

    前言 从事编程已经有一段时间了,突然发现,Java作为我的第一编程语言,自己似乎对她并有一个系统的思想.当下Java依旧保持着超高的热度,新特性也不断出现,从当初学习的java6版本到最近刚出的jav ...

  10. java基础 01

    java基础01 1. /** * JDK: (Java Development ToolKit) java开发工具包.JDK是整个java的核心! * 包括了java运行环境 JRE(Java Ru ...

随机推荐

  1. python 爬取知乎图片

    先上完整代码 import requests import time import datetime import os import json import uuid from pyquery im ...

  2. NoSQL 数据库之MongoDB

    1.MongoDB简介 1.1什么是MongoDB MongoDB 是一个跨平台的,面向文档的数据库,是当前 NoSQL 数据库产品中最热门的一种.它介于关系数据库和非关系数据库之间,是非关系数据库当 ...

  3. python中文件操作的基本方法

    在python中对一个文件进行操作,分为三大步:打开,操作,关闭 首先创建一个文件hello,里面内容为hello world 一.打开一个文件 1.#open(‘文件名或文件路径’,‘操作模式’,文 ...

  4. Letters CodeForces - 978C (二分)

    Time limit4000 ms Memory limit262144 kB There are nn dormitories in Berland State University, they a ...

  5. PAT Basic 1081

    1081 检查密码 本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能.该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母.数字和小数点 .,还必须既有字母也有数字. 输 ...

  6. Python类元编程

    类元编程是指在运行时创建或定制类.在Python中,类是一等对象,因此任何时候都可以使用函数创建新类,而无需用class关键字.类装饰器也是函数,不过能够审查.修改,甚至把被装饰的类替换成其他类.元类 ...

  7. 远程连接MYSQL8.0服务器问题

    title: 远程连接MYSQL8.0服务器问题 date: 2018-07-07 11:02:26 updated: tags: [MYSQL,坑] description: keywords: c ...

  8. Leetcode1--->数组中两数之和等于给定数

    题目: 给定一个数组nums,目标数target.在数组中找到两数之和为target的数,返回两数的下标举例: Given nums = [2, 7, 11, 15], target = 9, Bec ...

  9. day04_02 知识回顾、赋值运算符

    input命令输出的是字符串 数字转换成字符串 字符串转换成数字 以上成为类型的强制转换 运算符

  10. springmvc始终跳转至首页,不报404错误

    本篇博客特别补充:2017-3-4 9:42,经过分析和测试,本篇博客的解决方案只是碰巧,暂时的解决了问题.在后续的运行中,又出现了同样的毛病.经过日志跟踪,发现了端倪,下篇博客深入的剖析!本篇博客, ...