当前位置: 首页 > news >正文

linux java网络编程_Java网络编程深入之TCP协议编程

我们知道,TCP编程虽然在传输速度上不及UDP编程,但是,使用TCP编程可以保证数据在传输时的稳定性,而且TCP是建立在连接的基础之上的,因此,学习TCP编程,在网络编程中是十分重要的。那么,我们要了解TCP编程,就必须了解TCP协议编程在Java高级编程中的应用以及我们应当如何实现TCP协议编程。

同UDP协议编程一样,使用TCP协义编程,也是要在两个端口上实现的。不过在UDP中我们称作是发送端和接收端,而在TCP中我们称作是服务端和客户端。相同的是,在实现方式上,它们都是有规律可循、有步骤可以参考的。

首先,介绍一个实现TCP的服务端编程的一个重要的类ServerSocket:

编写TCP网络服务程序,首先要用到java.net.ServerSocket类用以创建服务器Socket

构造方法:

ServerSocket(intport):创建绑定到特定端口的服务器套接字

ServerSocket(intport, int backlog):利用指定的backlog(服务器忙时保持连接请求的等待客户数量),创建服务器套接字并将其绑定到指定的本地端口号。

ServerSocket(intport, int backlog, InetAddress bindAddr):使用指定的端口、侦听 backlog 和要绑定到的本地 IP 地址创建服务器。

在客户端,同样也有一个具有同等重要性的类:Socket

Socket:客户端要与服务器建立连接,必须先创建一个Socket对象

常用构造方法

Socket(Stringhost, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。

Socket(InetAddressaddress, int port):创建一个流套接字并将其连接到指定 IP 地址的指定端口号。

服务器端程序调用ServerSocket类中的accept()方法等待客户端的连接请求,一旦accept()接收了客户端连接请求,该方法返回一个与该客户端建立了专线连接的Socket对象,不用程序去创建这个Socket对象。建立了连接的两个Socket是以IO流的方式进行数据交换的,Java提供了Socket类中的getInputStream()返回Socket的输入流对象,getOutputStream()返回Socket的输出流对象。

下面,以图示及说明的方式,介绍ServerSocket和Socket在实现网络编程的原理。

45fd6d2c0ae397e2625ae8fd730fdafc.png

Server和Client端就相当于网络编程中的ServerSocket服务端和Socket客户端。

在服务端,通过ServerSocket的构造方法ServerSocket(int port):创建一个绑定到特定端口的服务器套接字对象,其中的port参数,是用以接受服务请求的指定端口,号然后

通过使用这个套接子对象的accept()方法实现对Socket客户端的监听,该方法返回一个Socket对象,无需特定的类来创建就可得到一个与客户端相同的类的的对象,该对象

是可以用来和Socket客户端进行交互的十分重要的。

同样,在客户端通过Socket(String host, int port):创建一个流套接字并将其连接到指定主机上的指定端口号。以实现同服务器连接的效果。

当在服务器端和Socket客户端都创建出了Socket对象时,我们就需要调用对象的相应方法来实现在服务器和客户端进行通信交互的目的。可以看到,通过服务器端的Socket对象的getOutputStream()和getInputStream()的方法与客户端的Socket对象的getInputStream()和getOutputStream()的方法是互逆的,这就像是一条通道,客户端就是通过这条通道实现与服务器端的交互的。

最后,当交互完成后要关闭两端的Socket接口。

关于实现Socket编程的具体步骤,如下图:

294a018681cae6ad826fd21392ae8787.png

这里,举一个TCP服务器端程序的编写实例:

/*客户端通过键盘录入信息,发送到服务器端

服务器端收到信息后,将信息转为大写返回给客户端。*/

package net.csdn.socket;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.io.OutputStreamWriter;

import java.io.Reader;

import java.net.ServerSocket;

import java.net.Socket;

public class TcpServer2 {

/**

* @param args

*/

publicstatic void main(String[] args) throws Exception{

ServerSocketss=new ServerSocket(9009);

Sockets=ss.accept();

System.out.println(s.getInetAddress().getHostAddress()+"...connection");

//读取客户的信息的输入流

InputStreamin=s.getInputStream();

BufferedReaderbrin=new BufferedReader(new InputStreamReader(in));

//向客户端发送信息输出流

BufferedWriter brout=new BufferedWriter(newOutputStreamWriter(s.getOutputStream()));

Stringline=null;

while((line=brin.readLine())!=null){

System.out.println("client:"+line);

brout.write(line.toUpperCase());

brout.newLine();

brout.flush();

}

s.close();

ss.close();

}

}

这样,就简单的实现了服务器端的程序的编写。

对于,TCP客户端程序的编写步骤,如图:

12fcb4bf33c820d315904452e71bd20c.png

同样以另一个对应的客户端编程的实例来简单实现TCP协议编程在客户端的实。

package net.csdn.socket;

importjava.net.Socket;

import java.io.*;

public classTcpClient2 {

/**

* @param args

*/

public static void main(String[] args)throws Exception{

Socket s=newSocket("192.168.49.13",9009);

//获取键盘录入

BufferedReader br=newBufferedReader(new InputStreamReader(System.in));

//数据输出给服务器端

OutputStreamout=s.getOutputStream();

BufferedWriter bwout=newBufferedWriter(new OutputStreamWriter(out));

//获取服务器端返回的数据

BufferedReader brin=new BufferedReader(newInputStreamReader(s.getInputStream()));

String line=null;

while((line=br.readLine())!=null){

if(line.equals("over"))

break;

bwout.write(line);

bwout.newLine();

bwout.flush();

String str=brin.readLine();

System.out.println("server:"+str);

}

br.close();

s.close();

}

}

通过上述的编程步骤及实例我们就可以对TCP协议编程有一个初步的了解了,因为是初步,所以,我们更要将它掌握牢固,这对于我们继续深入地学习TCP协议编程是十分重要的。0b1331709591d260c1c78e86d0c51c18.png

相关文章:

  • java顺序打印约瑟夫环_关于约瑟夫环问题,用java 编写程序,输出n个人出圈的顺序,书上的程序代码如下,但是有几点我搞不明白...
  • java翻译topping_java刚開始学习的人常见的问题
  • java里添加员工信息_SSH_框架整合4--添加员工信息
  • 毛刺现象 java_组合逻辑设计中的毛刺现象
  • java 有界类型_java泛型之有界类型
  • oracle mysql8_这一刻,MySQL 8终于追赶上了Oracle 8
  • power of three java_【LeetCode】326. Power of Three 3的幂(Easy)(JAVA)
  • python2和pytho3切换_电脑上同时安装Python2和Pytho
  • 学JS对学Java有用吗_【JS】编程语言那么多,为啥学Java的人那么多?
  • java offset用法_Java OffsetTime plusMinutes()用法及代码示例
  • php 判断是否对象_利用PHP判断JSON对象是否存在
  • php链接数据库2000,Linux下PHP连接Microsoft SQL Server 2000(图)
  • java获取内存变量,java – 易失性变量,从主内存刷新/读取
  • java二维函数怎么放到表里,调用函数传递二维数组
  • jsonrpc php使用,基于php的json rpc原理及应用
  • __proto__ 和 prototype的关系
  • 345-反转字符串中的元音字母
  • Docker容器管理
  • ECMAScript6(0):ES6简明参考手册
  • Javascript编码规范
  • Java编程基础24——递归练习
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Object.assign方法不能实现深复制
  • Promise初体验
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • session共享问题解决方案
  • 成为一名优秀的Developer的书单
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 分布式熔断降级平台aegis
  • 高度不固定时垂直居中
  • 什么软件可以剪辑音乐?
  • 思考 CSS 架构
  • 提醒我喝水chrome插件开发指南
  • 问题之ssh中Host key verification failed的解决
  • 译自由幺半群
  • Python 之网络式编程
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 如何正确理解,内页权重高于首页?
  • 整理一些计算机基础知识!
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #pragma once
  • #pragma once与条件编译
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (补)B+树一些思想
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (六)激光线扫描-三维重建
  • (南京观海微电子)——COF介绍
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (原)本想说脏话,奈何已放下
  • ***详解账号泄露:全球约1亿用户已泄露
  • .NET 5种线程安全集合
  • .NET MVC之AOP
  • .Net Web窗口页属性
  • .NET/C# 使用 SpanT 为字符串处理提升性能