tcp网络通信教程 java_基于java TCP网络通信的实例详解

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 TCP网络通信的实例详解相关文章请关注PHP中文网!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java博客论坛设计报告_javaweb课程设计报告个人博客网站的实现(Java).doc

javaweb课程设计报告个人博客网站的实现(Java)项目名称: 个人博客网站的实现(Java) 学生姓名:学 号:班 级:指导教师:2014年12月23日目录1 绪论11.1系统应用意义11.2主要设计任务11.3开发及运行环境11.3.1 JSP的基础——…

java replace stringbuilder_java.lang.StringBuilder.replace()方法实例

全屏java.lang.StringBuilder.replace()方法按照这个顺序,在指定的字符串的子字符串替换字符。子串开始在指定start的 索引,并延伸到该字符 end - 1,或如果序列的末端不存在这样的字符。声明以下是java.lang.StringBuilder.replace()方法的声…

中小学课java_java毕业设计_springboot框架的中小学排课与实现

这是一个基于java的毕业设计项目,毕设课题为springboot框架的中小学排课与实现, 是一个采用b/s结构的javaweb项目, 开发工具eclipsei/eclipse, 项目框架jspspringbootmybatis, 中小学排课与实现采用mysql进行数据存储, 并基于mybatis进行了orm实体关系映射, 该中小学排课与实现…

java 文件设置为只读文件系统_Java如何设置文件为只读?

在java编程中,如何设置文件为只读?此示例演示如何使用File类的file.setReadOnly()和file.canWrite()方法设置文件为只读模式。package com.yiibai;import java.io.File;public class ReadOnlyFile {public static void main(String[] args) {File file …

wordcount linux java_linux下在eclipse上运行hadoop自带例子wordcount

启动eclipse:打开windows->open perspective->other->map/reduce 可以看到map/reduce开发视图。设置Hadoop location.打开windows->show view->other-> map/reduce Locations视图,在点击大象后【new Hadoop location】弹出的对话框(Ge…

php java执行linux_java_java执行Linux命令的方法,本文实例讲述了java执行Linux命 - phpStudy...

java执行Linux命令的方法本文实例讲述了java执行Linux命令的方法。分享给大家供大家参考。具体实现方法如下:public class StreamGobbler extends Thread {InputStream is;String type;public StreamGobbler(InputStream is, String type) {this.is is;this.type …

java怎么接收前端请求_前端json post 请求 后端怎么接收

前端提交POST /api/test HTTP/1.1Host: 192.168.135.69:81Connection: keep-aliveContent-Length: 18Origin: http://192.168.135.69:81User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15…

minimum在java中的意思_Java Calendar getMinimum()用法及代码示例

Calendar类中的getMinimum(int calndr_field)方法用于返回此Calendar实例的给定日历字段(int calndr_field)的最小值。用法:public abstract int getMinimum(int calndr_field)参数:该方法采用一个参数calndr_field,该参数表示要操作的日历字段。返回值&…

django mysql 一对多_请教,django中 如何向带有外键(一对多和多对多)数据库中批量插入数据?...

已自行解决,代码如下:json格式:[{"标题": "小武","内容": "测试","类型":["情感","文学","散文"]"文章资源":[{"title":"小武.1…

安装php no permision,php安装过程中的No package ‘xxx’ found问题

php No package ‘oniguruma’ found今天安装php7.4的时候遇到这样的一个报错,然后yum install oniguruma oniguruma-devel,重试安装php,依然报错,又编译安装oniguruma,重试安装php,还是报错,问…

php httpclient.class.php,php实现httpclient类示例

class httpClient {public $buffer null; // buffer 获取返回的字符串public $referer null; // referer 设置 HTTP_REFERER 的网址public $response null; // response 服务器响应的 header 信息public $request null; // request 发送到服务器的 header 信息private $…

大学php老师,php高校教师总结计划系统

通过使用本系统,可以规范工作流程,提高办公效率,增强团队协同工作能力,实现科学的公文处理、事物管理、会议安排和人力管理,量化运营资源,预防管理真空,降低运行成本。还可以实现便利的信息发布…

好用的php空间,推荐国内三个优质的免费PHP空间

1.亿家免费国内PHP空间这是我见过最好的免费国内PHP空间了,这个BLOG就是由他的空间支撑的,所以你看到我这个空间的稳定,快速就代表着他们空间的优质了,推荐注册地址:www.e9china.net这个先要在他们论坛上发帖子&#x…

java处理脏数据,Java程序的脏数据问题

脏数据(Out-of-date data),指过时的数据。假如在您的java程序中存在脏数据,将或多或少地给软件系统带来一些问题,如:无法实时地应用已经发生改变的配置,软件系统出现一些莫名其妙的、难以重现的、后果严重的错误等等。…

制作自己的 Docker 容器

软件开发最大的麻烦事之一,就是环境配置。用户必须保证操作系统的设置,各种库和组件的安装,只有它们都正确,软件才能运行。docker从根本上解决问题,软件安装的时候,把原始环境一模一样地复制过来。 以 koa-…

notepad php源码,GitHub - CharlesKiki/Web-Notepad: 这是一个仿制有道云笔记的原生PHP小玩具。...

What is this?一个仿制笔记的Web应用。但是重点在于“重构”的乐趣。特点简言之,不使用框架就以原生的语言来开发一个网站,最大的好处就是最实现方法的理解会加深。但是不适用框架也意味着重复和冗余,这也导致了项目阅读时的阅读思路。设计稿…

matlab机械手ikine函数,关于Mtalab-robotics工具箱中的fkine和ikine两个函数的问题讨论!...

clear;clc;L1 Link([-pi/2 0 0 0 0],standard);L2 Link([0 10 0 -pi/2 0],standard);L3 Link([0 9.5 0 0 0],standard);L4 Link([-pi/2 3.2 -pi/2 0 0],standard);L5 Link([0 0 0 14.5 0],standard);r SerialLink([L1 L2 L3 L4 L5]);%r.name 5R工业机械臂-上电姿态;q […

matlab差分算子的灰度图像边缘检测,常用图像边缘检测方法及MATLAB研究

论文2 1年 2月 I 01 5日现代电子技术M o e n El c r i sT e h qu d r e ton c c ni e第3 4卷第 4期Fe .2 11 b 0 Vo1 3 . . 4 NO 4常用图像边缘检测方法及 Malb研究 t a韦炜(安文理学院,陕西西安西 706 ) 1 0 5({№吨~一~一一一三一一垂”. ; _堇;~~ _一…

mysql客户端重置密码是多少,mysql重置root密码

你可以按照以下简单的五步来重置/etc/init.d/mysql stop输出:Stopping MySQL database server: mysqld./usr/bin/mysqld_safe --skip-grant-tables &输出:[1] 5988Starting mysqld daemon with databases from /var/lib/mysqlmysqld_safe[6025]: sta…

go为什么比php性能好,刚学 GO,撸了个支付宝发券的程序,为什么性能还比不上 PHP ?...

下面是主程代码,这是详细代码func main() {//解析参数filePath : flag.String("f", "", "文件路径")tplId : flag.String("t", "", "模版 ID")flag.Parse()//解析密钥pk, err : ParsePrivateKey()chec…