TCP通信

网络编程的入门:
C/S结构 Client/Server 客户端和服务器结构            QQ 微信  迅雷
B/S结构 Browser/Server 浏览器和服务器结构            谷歌  火狐
 
两种架构各有优势      无论哪种都离不开网络的支持   
 
网络编程:
就是在一定协议下  实现两台计算机的通信程序
 
网络通信协议:
通信协议是对计算机必须遵守的规则------目的是完成数据交换
 
 
TCP/IP   传输控制协议/因特网互联协议  4层分层的模型
1.物理层
   数据链路层 底层网络协议
 
2.网络层 IP
3.传输层 TCP  UDP
4.应用层 HTTP
 
 
协议分类:
java.net包中 包含类和接口→两种常见的网络协议支持
TCP:面向连接的通信协议
三次握手:
  • 客户端向服务器发出请求  等待服务器确认     
  • 服务端向客户端做出响应  确认请求      
  • 客户端再次向服务器发出确认请求  确认连接  可以保证数据安全传输    下载文件、浏览网页
 
 
UDP:用户数据报协议   面向无连接的协议
  • 传输数据不需要连接  不管对方在不在线
  • 传输速度快,但是容易丢失数据,不可靠的协议   视屏会议、QQ聊天
 
 
 
​网络通信的三要素:
协议
IP IPv4    32位的二级制    42亿    0-255之间
   IPv6   解决网络资源不够用的问题
ipconfig:查询自己的IP
ping IP地址 判断网络是否畅通
本机IP:localhost
端口号       网络通信本质是两个进程(应用程序)    端口号用两个字节表示整数 0-65535 0-1023 不能赢知名网络服务已经用了
 
TCP  通信:
 
严格区别客户端  Client   服务端:Server
 
两端通信的步骤:
客户端主动连接服务器,连接成功才能通信
服务器端一定要先启动
 
java中 提供了两个类  来实现TCP程序
 
java.net.Socket----------创建对象Socket---------发送请求给服务器   服务器做出响应两者建立通信
java.net.ServleScoket--------创建对象ServleScoket-------相当于开启一个服务   用来等待客户端连接
 
 
Socket套接字:
 
此类实现客户端套接字(也可以就叫“套接字”)。套接字是两台机器间通信的端点。
 
构造方法  
 
Scoket(InetAddress address,int port) 创建对象 连接到主机指定的端口号
 
成员方法
  • getInputStream() 套接字的输入流
  • getOutputStream() 套接字的输出流
  • close()
  • shutdownOutput() 禁用此套接字的输出流
 
 
ServerScoket:
 
ServerScoket构造方法
 
ServerSocket(int port) 绑定一个指定端口号
 
 
成员方法
  • accept()   监听并且接受连接   用于客户端实现通信   阻塞直到建立连接
 
 
上传图片到服务器:
 
 
文件上传服务器的原理
 
  • 客户端使用本地字节流  读取本地文件
  • 客户端使用网络字节输出流  把图片传到服务器上
  • ​服务器使用网络字节输入流  读取客户端上传的文件
  • ​服务器端使用本地字节输出流  把客户端的文件保存到服务器的硬盘上
  • ​服务器网络输出流  给客户端写传输成功
  • ​客户端使用网络的字节输入流  读取服务器回写“传输成功”
​           
​    注意:
客户端/服务器端和本地文件读写  必须用自己的创建流
客户端/服务器端之间的交互   用Socket中提供的网络流
 
客户端本地------复制------服务器
服务器------复制------服务器本地硬盘
 
​    必须清楚:   数据源       目的地
 
 
 
 
 
ServerScoket:
 
package cn.kgc.tcp;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
 
public class TCPServer {
    public static void main(String[] args)throws IOException {
        //建立服务器ServerSocket对象,并指定端口号
        ServerSocket serverSocket = new ServerSocket(8800);
        //通过建立的服务器ServerSocket对象调用其accept()方法监听并获得客户端的Socket对象
        Socket socket = serverSocket.accept();
        //通过监听获得的客户端的Socket对象调用getInputStream()方法获取网络输入流对象
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        //使用网络输入流对象的read()方法读取客户端发送的数据
        int read = is.read(bytes);
        System.out.println(new String(bytes,0,read));
        //通过监听获得的客户端的Socket对象调用getOutputStream()方法获取网络输出流对象
        OutputStream os = socket.getOutputStream();
        //使用网络输出流对象的write()方法回应客户端
        os.write("OK~".getBytes());
        //释放资源
        socket.close();
        serverSocket.close();
    }
}
 
 
 
Socket:
 
package cn.kgc.tcp;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
 
public class TCPClient {
    public static void main(String[] args)throws IOException {
        //建立客户端Socket对象,指定(封装)IP地址和端口号
        Socket socket = new Socket("localhost",8800);
        //通过建立的客户端Socket对象调用其getOutputStream()方法获得网络输出流对象
        OutputStream os = socket.getOutputStream();
        //使用网络输出流对象的write()方法向服务器写入数据发出请求
        os.write("你好,服务器".getBytes());
        //通过建立的客户端Socket对象调用其getInputStream()方法获得网络输入流对象
        InputStream is = socket.getInputStream();
        byte[] bytes = new byte[1024];
        //使用网络输入流对象的read()方法读取服务器回应的数据信息
        int read = is.read(bytes);
        System.out.println(new String(bytes,0,read));
        //关闭流对象
        socket.close();
    }
}

原文地址:https://www.cnblogs.com/KiligYou/p/10978827.html