Java 网络通信【01】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 异常,我很不理解?
Java 网络通信【01】TCP的更多相关文章
- Java 网络通信(TCP/UDP)
1.InetAdress类 与 Socket类 >InetAdress >Socket 2.TCP/IP协议簇 客户端: 创建 Socket:根据指定服务端的 IP 地址或端口号构 ...
- java网络通信:TCP协议
面试的时候,面试官由于需要考察一个面试人对于网络编程的熟悉程度,往往会考察学生对于TCP.HTTP.UDP.这些常见的网络编程当中的协议的了解程度,而TCP协议则是首当其冲的,作为进程之间通信常用的一 ...
- Java中的TCP/UDP网络通信编程
127.0.0.1是回路地址,用于测试,相当于localhost本机地址,没有网卡,不设DNS都可以访问. 端口地址在0~65535之间,其中0~1023之间的端口是用于一些知名的网络服务和应用,用户 ...
- Java程序员从笨鸟到菜鸟之(十三)java网络通信编程
本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...
- java网络通信:异步非阻塞I/O (NIO)
转: java网络通信:异步非阻塞I/O (NIO) 首先是channel,是一个双向的全双工的通道,可同时读写,而输入输出流都是单工的,要么读要么写.Channel分为两大类,分别是用于网络数据的S ...
- java多线程实现TCP网络Socket编程(C/S通信)
目录 开篇必知必会 一.多线程技术 二.实现多线程接收 1.单线程版本 2.多线程版本 三.多线程与进程的关系 四.客户端界面完整代码 五.多线程通信对比 最后 开篇必知必会 在前一篇<Java ...
- Java学习01
Java学习01 第一章 1.JRE与JDK JDK(JAVA Develop Kit,JAVA开发工具包)提供了Java的开发环境和运行环境,主要用于开发JAVA程序,面向Java程序的开发者; J ...
- java学习之tcp与udp的实现
package com.gh.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Inp ...
- [Java 教程 01] Hello,Java!
前言 从事编程已经有一段时间了,突然发现,Java作为我的第一编程语言,自己似乎对她并有一个系统的思想.当下Java依旧保持着超高的热度,新特性也不断出现,从当初学习的java6版本到最近刚出的jav ...
- java基础 01
java基础01 1. /** * JDK: (Java Development ToolKit) java开发工具包.JDK是整个java的核心! * 包括了java运行环境 JRE(Java Ru ...
随机推荐
- 如何用纯 CSS 创作一台拍立得照相机
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/YjYgey 可交互视频 此视频是可 ...
- 【laravel】Laravel 5 TokenMismatchException on PHP 5.6.9
When I realized this was only happening in IE and Chrome, but not Firefox, it led me to the fix. The ...
- CSS清除浮动8大方法
CSS清除浮动是每一位web前端工程师都要掌握的技术,也是让每一位刚入门的前端工程师感到头疼的问题, 下面就来讲一下CSS清除浮动的原理和各种解决方法,大家可以根据实际情况选择最佳的解决方案. 在用D ...
- Django之cookie、session
会话跟踪技术 可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应. 一次会话过程中,我们应该注意的是什么呢? 那就是,一些操作要保证用户操作的是用户自己个人的数据.举个 ...
- LeetCode(164)Maximum Gap
题目 Given an unsorted array, find the maximum difference between the successive elements in its sorte ...
- Leetcode(204) Count Primes
题目 Description: Count the number of prime numbers less than a non-negative number, n. Credits: Speci ...
- HDU:2255-奔小康赚大钱(KM算法模板)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Mem ...
- C++基础——1.变量和基本类型(基于c++11)
C++11类型 基本类型 字面值常量(literal) 比如:一个形如42的值,即为常量 变量 初始值 初始化不是赋值,初始化是创建变量的时候给一个初始值:而赋值是擦除当前值,用新值代替. 列表初始化 ...
- CSS 预处理器框架
CSS 预处理器框架 可以按照需求来使用别人的代码 1.sass (compass) 2.less (lesshat/EST) 3.提供现成的 mixin 4.类似 JS 类库 ,封装常用功能 css ...
- webdriver高级应用- 在ajax方式产生的浮动框中,单击选择包含某个关键字的选项
Ajax简介: Ajax:局部刷新,原理上也是一个js,js调用服务器的远程接口刷新局部页面数据. Ajax = 异步 JavaScript 和 XML(标准通用标记语言的子集). Ajax 是一种用 ...