第八天Java基础(网络编程)

1.TCP/IP协议

三次握手
1.客户端请求服务器,等待服务器确认
2.服务端回应客户端,通知连接
3.客户端再次请求服务器,进行连接确认

1.1 IP地址

IPv4:32位的二进制数,分为4个字节,a.b.c.d 的形式 0~255
ipv6:
常用的命令
ipconfig 本机IP
ping 空格 IP地址 网络是否联通

1.2 端口号

2.TCP通信

2.1 Socket类

public static void main(String[] args) throws IOException {
        //1.创建socket用于连接服务器
        Socket socket = new Socket("localhost",8888);
        //2.获取写流(输出流,开始写东西),
        OutputStream os = socket.getOutputStream();
        os.write("你好服务器2222!".getBytes());
        os.flush();
        //3.获取读流(输入流,开始读东西)
        InputStream is = socket.getInputStream();
        byte []bytes = new byte[1024];
        int len = is.read(bytes);
        System.out.println(new String(bytes,0,len));
        //4.释放资源
        socket.close();
    }

2. ServerSocket类

注意,Socket的InputStream在读取到null后会进入阻塞状态,所以在写流结束后应该调用sss告诉流,结束。

public static void main(String[] args) throws IOException {
        //1.获取ServerSocket用于获取客户端的socket
        ServerSocket server = new ServerSocket(8888);
        Socket socket = server.accept();
        //2.读取客户端发送的消息
        InputStream is = socket.getInputStream();//读取数据的流,也叫输入流
        byte []bytes = new byte[1024];
        int read = is.read(bytes);
        System.out.println(new String(bytes,0,read));
        //3.给客户端返回消息
        OutputStream os = socket.getOutputStream();//写数据的流,也叫输出流
        os.write("服务器接收到消息!".getBytes());
        os.flush();
        //4.释放资源
        socket.close();
        server.close();
    }

3. 小练习文件上传

1.服务端代码

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

/**
 * 服务器类
 */
public class CopServer {
    public static void main(String[] args)throws IOException{
        openServer("D:\\word\\f");
    }
    /**
     * 保存文件的方式
     * @param filePath
     * 1.
     */
    private static void openServer(String filePath) throws IOException{
        final int path = 8888;//定义一个常量带表服务器端口号
        ServerSocket server = new ServerSocket(path);//获取server
        while(true){//获取多个客户端
            Socket socket = server.accept();//1.获取socket,注意在确认有客户端访问之前什么也别做
            new Thread(()-> {//开启线程,使得效率更高
                    InputStream is = null;
                    File file = new File(filePath);//创建文件夹
                    if (!file.isDirectory()) file.mkdirs();//如果文件夹不存在,就创建
                    String fileName = "zpx"+System.currentTimeMillis()+new Random().nextInt(9999)+".jpg";//文件名
                    FileOutputStream fos = null;//文件输出流,写文件
                    try {
                        fos = new FileOutputStream(file+"\\"+fileName);//定义写文件
                        is = socket.getInputStream();//2.获取socket输入流
                        int len = 0;
                        byte []bytes = new byte[1024];
                        while((len = is.read(bytes))!=-1){
                            fos.write(bytes);//3.将获取到的字符流写入到文件输出流中
                        }
                    }catch(IOException e){
                        System.out.println(e.toString());
                    }finally{
                        try {
                            fos.close();
                            socket.close();//4.关闭流
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
            }).start();
        }
    }
}

2.客户端

package mode06;

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

public class CopSocket {
    public static void main(String[] args) throws IOException {
        show();
        show();
        show();
    }

    private static void show() throws IOException{
        Socket socket = new Socket("localhost",8888);
        OutputStream os = socket.getOutputStream();
        File file = new File("D:\\word\\c\\d");
        FileInputStream fis = new FileInputStream(file+"\\timg (2).jpg");
        int len = 0;
        byte []bytes = new byte[1024];
        while ((len = fis.read(bytes))!= -1){
            os.write(bytes);
        }
        socket.shutdownOutput();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值