热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

我们知道,TCP编程虽然在传输速度上不及UDP编程,但是,使用TCP编程可以保证数据在传输时的稳定性,而且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在实现网络编程的原理。

0818b9ca8b590ca3270a3433284dd417.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编程的具体步骤,如下图:

0818b9ca8b590ca3270a3433284dd417.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客户端程序的编写步骤,如图:

0818b9ca8b590ca3270a3433284dd417.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协议编程是十分重要的。



推荐阅读
  • python网络编程 day27 网络编程初识 ——socket
    一、内容回顾1、两个内置函数(装饰器)及类中的魔术方法 ... [详细]
  • 本文介绍了网络编程的要点,包括InetAddress类获取IP地址的方法,IP地址的定义和表示方法,IPv4和IPv6的区别,以及网络通信协议中的端口和协议类型。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 1、Ipv4只能用于内网,外网只能用2、DNS:把域名解析成ip地址3、MAC地址就是物理地址(网卡序列号)   IP地址:电脑序列号4、不同电脑,微信之间互相通信,靠的是端口;  ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • c# java socketn 字节流_C#Socket编程详解(一)TCP与UDP简介
    一、TCP与UDP(转载)1、TCP1.1定义TCP(TransmissionControlProtocol)传输控制协议。是一种可靠的、面向连接的协议(eg:打电话)、传输效率低 ... [详细]
  • python计算数据包校验和(python接口数据校验)
    本文目录一览:1、怎么用python算p值和t检验 ... [详细]
  • 网络编程:其实就是在学socketsocket是什么?翻译过来称为套接字是对底层的TCPIPUDP等网络协议进行封装使得上层的应用程序开发者,不用直接接触这对复杂,丑陋的协议在程序 ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • python图书管理系统类_Python标准库socketserver使用线程混入实现异步TCP服务器
    推荐图书:《Python程序设计开发宝典》,ISBN:978-7-302-47210-0,董付国,清华大学出版 ... [详细]
author-avatar
xin丶儿_462
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有