java.net 包中提供了两种常见的网络协议的支持:

TCP:TCP 是传输控制协议的缩写,它保障了两个应用程序之间的可靠通信。通常用于互联网协议,被称 TCP / IP。

  1. TCP协议:

    • 使用TCP协议前需要建立TCP链接形成数据传输通道
    • 传输前采用三次握手方式,是可靠的
    • TCP协议进行通信的两个应用进程:客户端、服务端
    • 在连接中可进行大数据量的传输
    • 传输完毕,释放链接,效率低
  2. Socket编程
    • 通信的两端都要有Socket
    • 网络通信其实就是Socket之间通信
    • Socket允许程序把网络链接当成一个流,数据在两个Socket间通过IO传输
    • 发起请求的一端叫客户端,等待请求的一端为服务端

      *网络编程基本步骤:
  3. TCP网络编程步骤:

    • 1.创建客户端Socket
    • 2.Socket调用getOutputStream()方法,创建输出流(输入流)
    • 3.调用write()方法,写入数据
    • 4.接受来自服务端的信息

      *(若信息是双向传递的,即信息-来-回,而非单向传递,则需要在发送信息之后加上socket.shutdownOutput(),表示信息已发送完毕)
    • ———————————————
    • 5.创建服务端ServerSocket
    • 6.ServerSocket调用accept()方法,获取socket
    • 7.Socket调用getInputStream(),获取输入流
    • 8.接受来自客户端的信息
    • 9.处理来自客户端是信息
    • 10.返回信息给客户端
    • 11.关闭连接资源

TCP编程实例:

1.实例一:

客户端给服务端发送消息,服务端把消息输出到控制台上(单向发送消息)

//信息单向传递

//客户端—发送消息

//服务端—接收消息

public class TestTCP {

    //客户端
@Test
public void client(){ Socket socket = null;//初始化时要置空,否则在finally语句中,关闭连接时会报错 OutputStream os = null;
try {
//1.首先创建Socket,通过构造器指明服务端的IP地址以及接受程序的端口号
socket = new Socket(InetAddress.getByName("localhost"), 9090);
//2.Socket调用getOutputStream,创建流,发送数据
os = socket.getOutputStream();
//3.通过流,发送信息
os.write("我是客户端!".getBytes());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(os != null){
//4.关闭链接
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket != null){
//5.关闭Socket链接
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//服务端
@Test
public void server(){ ServerSocket ss = null; Socket s = null; InputStream is = null;
try {
//1.创建ServerSocket对象,通过构造器指明自身的端口号
ss = new ServerSocket(9090);
//2.调用accept(),返回一个Socket对象
s = ss.accept();
//3.调用Socket对象的getInputStream()获取一个从客户端发送过来的输入流
is = s.getInputStream();
//4.从流中读取数据,存到Byte[]数组中
byte[] b = new byte[20];
int len;
while((len = is.read(b)) != -1){
//先用String str接收
String str = new String(b, 0, len);
System.out.print(str);
System.out.println("收到来自"+s.getInetAddress().getHostName()+"的信息");
}
} catch (IOException e) {
e.printStackTrace();
}finally{
//关闭资源
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(s != null){
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ss != null){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

2.实例二:

  • 客户端给服务端发送消息,服务端将消息打印到控制台上,同时发送“已收到信息”给客户端(一来一回消息传递)

    *信息双向发送

    *客户端:发送信息–接受信息

    *客户端(信息发送完毕之后要显示的告诉服务端,发送完毕!)

    *服务端:接受信息–发送信息

代码:

public class TestTCP1 {

    //客户端
@Test
public void client(){
//1.创建Socket对象
Socket socket = null;
//2.输出流
OutputStream os = null;
//接收来自服务器的响应信息,输入流
InputStream is = null;
try {
//socket = new Socket(InetAddress.getLocalHost(), 8989);作用同下一样
socket = new Socket(InetAddress.getByName("127.0.0.1"), 8989);
os = socket.getOutputStream();
//发送信息,到服务器,写信息
String st = new Scanner(System.in).nextLine();
os.write(st.getBytes("GBK"));
socket.shutdownOutput();//输出完毕
is = socket.getInputStream();
int len;
byte[] b = new byte[20];
//接收信息,来自服务器的信息
System.out.print("客户端:已发送!\n");
while((len = is.read(b)) != -1){
String str = new String(b,0,len,"GBK");
System.out.print(str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} //服务端
@Test
public void server(){
//1.ServerSocket对象
ServerSocket ss = null;
Socket s = null;
//2。输入流对象
InputStream is = null;
//服务器响应,返回发送信息
OutputStream os = null;
try {
ss = new ServerSocket(8989);
s = ss.accept();
is = s.getInputStream();
byte[] b = new byte[20];
int len;
//接收客户端发送的消息
//System.out.print("");
while((len = is.read(b)) != -1){
String str = new String(b,0,len,"GBK");
System.out.print(str);
}
//发送信息
os = s.getOutputStream();
os.write("服务端已收到消息,啦啦啦啦啦啦啦!".getBytes("GBK"));
} catch (IOException e) {
e.printStackTrace();
}finally{
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(s != null){
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ss != null){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}

3.实例三:

  • 从客户端发送文件到服务端,服务端保存到本地,并返回“发送成功!”给客户端,关闭相关链接
  • 客户端:首先读文件进来到程序(入)—发送文件(出)—接受返回信息(入)
  • 服务端:接受文件(入)—程序写出文件保存本地(出)—返回信息(出)

代码:

public class TestTCP2 {

    //客户端
@Test
public void client(){
//1.创建Socket对象
Socket socket = null;
//2.创建文件对象,创建输入流对象(文件首先要加读入到程序中)
FileInputStream fis = null;
//3.输出流,进行文件传输
OutputStream os = null;
//6.接受发送成功后返回信息
InputStream is1 = null;
try {
socket = new Socket(InetAddress.getByName("127.0.0.1"),9898);
os = socket.getOutputStream();
fis = new FileInputStream(new File("file/1.jpg"));
//5.传输文件,文件首先要读入到程序(len = is.read(b)),再写出(os.write(b, 0, len);)
byte[] b = new byte[1024];
int len;
//文件读入到程序,并进行传输
while((len = fis.read(b)) != -1){
os.write(b, 0, len);
}
//6.发送完毕
socket.shutdownOutput();
//7.接收返回的信息
is1 = socket.getInputStream();
byte[] b1 = new byte[20];
int leng;
while((leng = is1.read(b1)) != -1){
String str = new String(b1, 0, leng);
System.out.println(str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(is1 != null){
try {
is1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os != null){
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fis != null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
} if(socket != null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} //服务端
@Test
public void server(){
//1.服务端ServerSocket
ServerSocket ss = null;
//2.调用accept()方法,返回一个Socket对象
Socket s = null;
//3.接受数据
InputStream is = null;
//4.创建文件对象,用于承载数据
FileOutputStream fos = null;
//6.返回信息
OutputStream os1 = null;
try {
ss = new ServerSocket(9898);
s = ss.accept();
is = s.getInputStream();
fos = new FileOutputStream(new File("file/1_1.jpg"));
//5.接收数据(len = is.read()),写出文件(os.write())
byte[] b = new byte[1024];
int len;
while((len = is.read(b)) != -1){
fos.write(b , 0 , len);
}
os1 = s.getOutputStream();
os1.write("发送成功!".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(os1 != null){
try {
os1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fos != null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(is != null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(s != null){
try {
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(ss != null){
try {
ss.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} }

网络编程(1)—TCP的更多相关文章

  1. C#网络编程之---TCP协议的同步通信(二)

    上一篇学习日记C#网络编程之--TCP协议(一)中以服务端接受客户端的请求连接结尾既然服务端已经与客户端建立了连接,那么沟通通道已经打通,载满数据的小火车就可以彼此传送和接收了.现在让我们来看看数据的 ...

  2. 嵌入式linux的网络编程(1)--TCP/IP协议概述

    嵌入式linux的网络编程(1)--TCP/IP协议概述 1.OSI参考模型及TCP/IP参考模型 通信协议用于协调不同网络设备之间的信息交换,它们建立了设备之间互相识别的信息机制.大家一定都听说过著 ...

  3. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  4. 【网络编程1】网络编程基础-TCP、UDP编程

    网络基础知识 网络模型知识 OSI七层模型:(Open Systems Interconnection Reference Model)开放式通信系统互联参考模型,是国际标准化组织(ISO)提出的一个 ...

  5. 【转载】[基础知识]【网络编程】TCP/IP

    转自http://mc.dfrobot.com.cn/forum.php?mod=viewthread&tid=27043 [基础知识][网络编程]TCP/IP iooops  胖友们楼主我又 ...

  6. Java 网络编程 -- 基于TCP 模拟多用户登录

    Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...

  7. python网络编程05 /TCP阻塞机制

    python网络编程05 /TCP阻塞机制 目录 python网络编程05 /TCP阻塞机制 1.什么是拥塞控制 2.拥塞控制要考虑的因素 3.拥塞控制的方法: 1.慢开始和拥塞避免 2.快重传和快恢 ...

  8. 网络编程——基于TCP协议的Socket编程,基于UDP协议的Socket编程

    Socket编程 目前较为流行的网络编程模型是客户机/服务器通信模式 客户进程向服务器进程发出要求某种服务的请求,服务器进程响应该请求.如图所示,通常,一个服务器进程会同时为多个客户端进程服务,图中服 ...

  9. C#网络编程之--TCP协议(一)

    TCP 是面向连接的传输协议 面向连接,其实就好比,A打电话给B,如果B接听了,那么A和B之间就的通话,就是面向连接的 TCP 是全双工的传输协议 全双工,这个理解起来也很简单,A打电话给B,B接听电 ...

  10. java 网络编程 UDP TCP

    网络编程 网络编程主要用于解决计算机与计算机(手机.平板..)之间的数据传输问题. 网络编程: 不需要基于html页面就可以达到数据之间的传输. 比如: feiQ , QQ , 微信....网页编程: ...

随机推荐

  1. 转载:分布式文件系统 - FastDFS 在 CentOS 下配置安装部署(1)

    原文:http://blog.mayongfa.cn/192.html 一.安装 libfastcommon 和 FastDFS 1.下载安装 libfastcommon ,这里是通过wget下载(我 ...

  2. Android网络通信(8):WiFi Direct

    Android网络通信之WiFi Direct 使用Wi-Fi Direct技术可以让具备硬件支持的设备在没有中间接入点的情况下进行直接互联.Android 4.0(API版本14)及以后的系统都提供 ...

  3. Linux下进程/程序网络带宽占用情况查看工具 -- NetHogs

    http://www.vpser.net/manage/nethogs.html   来自.  最后略有修改 之前VPS侦探曾经介绍过流量带宽相关的工具如:iftop.vnstat,这几个都是统计和监 ...

  4. LeetCode(46):全排列

    Medium! 题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [ ...

  5. jquery----用户密码验证

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. oracle表分区创建

    一.什么是分区表表分区有以下优点: 1.数据查询:数据被存储到多个文件上,减少了I/O负载,查询速度提高. 2.数据修剪:保存历史数据非常的理想. 3.备份:将大表的数据分成多个文件,方便备份和恢复. ...

  7. ORACLE分页查询SQL语法——高效的分页

    --1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT  ...

  8. 自己实现一个和PYTHON的库一模一样的sha_256算法

    同时在看一本书<从零开始-自己动手写区块链>, 这书讲得易懂,我也动手实践一下. 这个算法和python3本身的实现相同, 所以,同样的字串,摘要是相同的. import struct i ...

  9. python全栈开发day48-jqurey自定义动画,jQuery属性操作,jQuery的文档操作,jQuery中的ajax

    一.昨日内容回顾 1.jQuery初识 1).使用jQuery而非JS的六大理由 2).jQuery对象和js对象转换 3).jQuery的两大特点 4).jQuery的入口函数三大写法 5).jQu ...

  10. 基于kubernetes集群部署DashBoard

    目录贴:Kubernetes学习系列 在之前一篇文章:Centos7部署Kubernetes集群,中已经搭建了基本的K8s集群,本文将在此基础之上继续搭建K8s DashBoard. 1.yaml文件 ...