菜鸡学习day22_网络通信协议

菜鸡学习day22

package day22;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
网络通信协议(连接和通信的规则)
双方同时遵守才能数据传输
TCP/IP协议
定义了计算机如何炼乳因特网,以及数据如何在他们之间传输的标准
采用四层的分层模型(了),每层都呼叫它的下一层所提供的协议来完成自己的需求
应用层(应用程序)
传输层(网络通信)*****
网络层
数据链路层
物理层

协议分类
UDP
无连接通信协议
耗资小,通信效率高
面向无连接特性,不能保证数据的完整性,视频会议。。
数据被限制在64kb以内

TCP
传输控制协议
面向连接的通信协议,传输数据之前必须先建立逻辑链接
“三次握手”,客户端发出请求,服务端接收请求,客户端确认链接

网络编程三要素
协议
IP地址
端口号

IP地址
互联网协议地址(给网路中的计算机设备做唯一的编号)
分类
IPv4    32位二进制数,通常4字节,最多可以表示42亿个
IPv6    128位,16字节,大
常用命令
ipconfig查看IP地址
ping空格 IP地址     查看网络是否联通
ping localhost

端口号
两个字节组成,0-65535
是一个逻辑端口,无法直接看到,可以用软件查看
网络软件一打开,系统就随机分配端口号,或指定端口号
注:1024之前的端口号不能用,已被分配
    端口号不能重复
使用IP地址加端口号,就能保证数据准确发送
常用端口号
80端口 网络端口   www。baidu。com:80
数据库 mysql:3306  orale:1521
.。。

服务器端必须明确两件事情
1.多个客户端同时和服务器进行交互,服务器需要知道是哪个客户端发出请求
    服务器端有一个方法accept,获取到请求的客户端
2.需要多个IO流对象(服务器使用客户端的流进行交互)
    服务器没有IO流,先获取请求的客户端对象Socket,使用其提供的IO流与客户端进行交互
    服务器使用客户端的字节输入流读取数据,使用客户端的字节输出流发送数据

Socket表示客户端的类
此类实现客户端套接字(包含了IP地址和端口号的网络单位)
构造方法
Socket (String host,int port)创建一个流套接字并将其来凝结到指定主机的指定端口号
参数:host 服务器主机名称/IP地址
     port 服务器端口号
成员方法
OutputStream getOutputStream()返回套接字的输出流
InputStream getInputStream()返回套接字的输入流
void close()关闭套接字
实现步骤:1.创建客户端对象,构造方法绑定IP地址和端口号
         2.获取输出流对象
         3.write发送数据
         4.获取输入流对象
         5.read读取数据
         6.释放资源socket
注:1.客户端与服务器进行交互,必须使用Socket提供的网络就,不能自己创建流独享
    2.当创建客户端对象时,就会请求三次握手,若服务器没有启动,则抛出异常,否则可以叫胡
 */
public class D2201 {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",1111);
        OutputStream os = socket.getOutputStream();
        os.write("客户端发送。".getBytes());

        InputStream is = socket.getInputStream();
        byte[] b = new byte[1024];
        int len = is.read(b);
        System.out.println(new String(b,0,len));

        socket.close();
    }
}
package day22;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/*
服务器
ServerSocket 表示服务器的类
构造方法
ServerSocket(int port)

服务器端必须知道是哪个客户端发出请求
使用gaccept方法获取客户端对象
服务器实现步骤:1.创建服务器对象和指定端口号
              2.使用accept获取客户端对象
              3.获取字节输入流
              4.read
              5.获取字节输出流
              6.write
              7.释放资源Socket SeverSocket
 */
public class Sever {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(1111);
        Socket socket = ss.accept();//获取客户端对象
        InputStream is = socket.getInputStream();

        byte[] b = new byte[1024];
        int len = is.read(b);
        System.out.println(new String(b,0,len));

        OutputStream os = socket.getOutputStream();
        os.write("服务器收到。".getBytes());

        ss.close();
        socket.close();
    }
}
package day22;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

/*
文件上传案例
客户端读取本地文件,上传到服务器,服务器把文件保存在服务器的硬盘中

 */
public class anLi {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",2222);
        //本地字节输入流对象
        FileInputStream fis = new FileInputStream("day22\\a.txt");
        //网络字节输出流
        OutputStream os = socket.getOutputStream();
        byte[] bytes = new byte[1024];
        int len = 0;
        while( (len = fis.read(bytes)) != -1){//读取本地文件
            os.write(bytes,0,len);//写入客户端
        }
        System.out.println("客户端从本地读取文件成功。");

        socket.shutdownOutput();//消除read阻塞状态

        //网络字节输入流对象
        InputStream is = socket.getInputStream();
        while ((len = is.read(bytes)) != -1){//读取服务器数据
            System.out.println(new String(bytes,0,len));//输出
        }

        socket.close();
        fis.close();
    }
}
package day22;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Random;

public class Server2 {
    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(2222);
        while(true) {
            Socket socket = server.accept();
            //多线程
            new Thread(new Runnable(){
                @Override
                public void run() {
                    try {
                        File file = new File("day22");
                        if (!file.exists()) {
                            file.mkdirs();//???
                        }

                        String filename = "itcast" + System.currentTimeMillis() + new Random().nextInt(9999) + ".txt";

                        FileOutputStream fos = new FileOutputStream(file + "\\" + filename);
                        InputStream is = socket.getInputStream();
                        byte[] bytes = new byte[1024];
                        int len = 0;
                        while ((len = is.read(bytes)) != -1) {
                            fos.write(bytes, 0, len);
                        }
                        OutputStream os = socket.getOutputStream();
                        os.write("服务器复制文件完成。".getBytes());

                        fos.close();
                        socket.close();

                    } catch (IOException e) {
                        System.out.println(e);
                    }
                }
            }).start();
        }
        //server.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值