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

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. vue使用原生js实现滚动页面跟踪导航高亮

    需要使用vue做一个专题页面. 滚动页面指定区域导航高亮. BetterScroll:可能是目前最好用的移动端滚动插件 如何自定义CSS滚动条的样式? 监听滚动页面事件,对比当前页面的位置与元素的位置 ...

  2. IDEA入门学习笔记1:资料收集

    IDEA2018软件下载 :https://mp.weixin.qq.com/s?__biz=MzIwMjE1MjMyMw==&mid=2650200056&idx=1&sn= ...

  3. solr配置中文分词器

    配置IK分词器 在/opt/solr-7.7.1/server/solr-webapp/webapp/WEB-INF/lib目录中加入IK分词器的jar包 在/opt/solr-7.7.1/serve ...

  4. LeetCode(164)Maximum Gap

    题目 Given an unsorted array, find the maximum difference between the successive elements in its sorte ...

  5. LeetCode(220) Contains Duplicate III

    题目 Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  6. FSMC原理通俗解释

    所以不用GPIO口直接驱动液晶,是因为这种方法速度太慢,而FSMC是用来外接各种存储芯片的,所以其数据通信速度是比普通GPIO口要快得多的.TFT-LCD 驱动芯片的读写时序和SRAM的差不多,所以就 ...

  7. LightOj:1265-Island of Survival

    Island of Survival Time Limit: 2 second(s) Memory Limit: 32 MB Program Description You are in a real ...

  8. poj 1862 2*根号(n1*n2)问题 贪心算法

    题意: 有n个数,要把其中2个数进行2*根号(n1*n2)操作,求剩下最小的那个数是多少? 哭诉:看题目根本没看出来要让我做这个操作. 思路: 每次把最大的,次大的拿出来进行操作 用"优先队 ...

  9. BZOJ 4355: Play with sequence

    调了好久,还是黑盒测试有前途 我以前怕不是学了假的吉利线段树(我第一次知道还要记次小值去更新的........) #include<cstdio> #include<algorith ...

  10. 《Scrum实战》第2次课【取得大家的支持】课后作业汇总

    作业:<变革之心>读后感 孟帅: 2017-7-12http://www.cnblogs.com/mengshuai1982/p/7153985.html