【无标题】

IP

在这里插入图片描述

127.0.0.1 本机IP 英文localhost
在这里插入图片描述
inetAddress没有字段没有构造器,而只能通过方法来使用
字段 (Field),是 Java 编程语言中类的一个成员,主要用来存储对象的状态(如同某些编程语言中的变量),所以有时也可称为成员字段或成员变量。

端口Port

PID(Process Identification)进程识别号,它是进程运行时系统随机分配,并不代表专门进程,和具有固定号码的端口号不同。在这里插入图片描述
在以上显示的端口号都有其特定含义,就像关键字,避开不要使用,否则会出现"端口被占用"的错误

InetSocketAddress源码
在这里插入图片描述
案例:
在这里插入图片描述

通信协议

协议;约定一个标准
UDP(Users Datagram Portocol)用户数据报协议
特点:不连接不稳定
三次握手
在这里插入图片描述
四次分手
在这里插入图片描述

TCP(Transmission Control Portocol)传输控制协议
TCP相当于打电话
特点:连接,稳定
在这里插入图片描述

TCP聊天

尽管socket无参 ,但是还是可以传参数的
在这里插入图片描述

客户端

要知道一个服务器的地址、端口号
创建一个socket连接
发送消息IO流
释放资源

package com.zowa.lesson02;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;

//客户端
public class TcpClientDemo01 {
    public static void main(String[] args) {
Socket socket=null;
        OutputStream outputStream=null;
        try { //1.要知道服务器的地址
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            //2.端口号
            int port=9999;
            //3.创建一个socket链接
           socket = new Socket(serverIP,port);
            //4.发送信息IO流
outputStream=socket.getOutputStream();
outputStream.write("你好学习".getBytes());


        }


        //提升捕获异常的作用域
        catch (Exception e) {
            e.printStackTrace();
        }finally {
            if (outputStream!=null){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                   e.printStackTrace();
                }
            }
        }
    }
}
服务端

需要一个地址
等待客户端连接
读取客户端的消息
关闭资源

package com.zowa.lesson02;

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

//服务端
public class TcpServerDemo01 {
    public static void main(String[] args) {
        ServerSocket serverSocket=null;
        Socket socket=null;
        InputStream inputStream=null;
        ByteArrayOutputStream byteArrayOutputStream=null;


        try {//服务器的地址
            serverSocket = new ServerSocket(9999);
            //等待客户端链接
             socket=serverSocket.accept();
            //读取客户端信息
             inputStream= socket.getInputStream();
             byteArrayOutputStream=new ByteArrayOutputStream();
            byte[] buffer=new byte[1024];
            int len;
            while ((len=inputStream.read(buffer))!=-1){
                //将buffer缓冲区中的内容写入数字输出流
                byteArrayOutputStream.write(buffer,0,len);

            }
            //用toString 的方式输出 保证不会乱码
            System.out.println(byteArrayOutputStream.toString());



        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
if (byteArrayOutputStream!=null){
    try {
        byteArrayOutputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}if (inputStream!=null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
if (socket!=null) {
    try {
        socket.close();
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}if (serverSocket!=null) {
                try {
                    serverSocket.close();
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }


        }
    }
}

通过TCP实现文件传输

客户端

获取服务器IP和端口号
创建socket连接
上传文件
通知服务器上传完毕
接收提示信息

public class TcpClientDemo {
    public static void main(String[] args) {
        try {
            //获取IP和端口号
            InetAddress serverIP = InetAddress.getByName("127.0.0.1");
            int port = 9999;
            //创建一个socket连接
            Socket socket=new Socket(serverIP,port);
            //创建输出流
            OutputStream os=socket.getOutputStream();
            //读取文件
            File f=new File("E:/a.txt");
            FileInputStream fis=new FileInputStream(f);
            //读出文件内容
            byte[] buffer=new byte[1024];
            int len;
            while((len=fis.read(buffer))!=-1){
                os.write(buffer,0,len);
            }
            //通知服务器端文件传输完毕
            socket.shutdownOutput();
            //接收服务端返回信息
            InputStream is=socket.getInputStream();
            ByteArrayOutputStream baos= new ByteArrayOutputStream();
            byte[] buffer2=new byte[1024];
            int len2;
            while((len2=is.read(buffer2))!=-1){
                baos.write(buffer2,0,len2);
            }
            System.out.println(baos.toString());
            //关闭通道
            fis.close();
            os.close();
            socket.close();
        } catch (Exception e) {
                e.printStackTrace();
        }
    }
}
服务端

创建服务器
监听客户连接
接收文件
返回提示信息

public class TcpServerDemo {
    public static void main(String[] args) {
        try{
            //创建服务器
            ServerSocket serverSocket=new ServerSocket(9999);
            //监听客户端连接
            Socket socket=serverSocket.accept();
            //获取输入流
            InputStream is=socket.getInputStream();
            //文件输出
            File f=new File("E:/b.txt");
            FileOutputStream fos=new FileOutputStream(f);
            byte[] buffer=new byte[1024];
            int len;
            while((len=is.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            //通知客户端接收完毕
            OutputStream os=socket.getOutputStream();
            os.write("文件上传完毕".getBytes());
            os.close();

            //关闭通道
            fos.close();
            is.close();
            socket.close();
            serverSocket.close();

        }catch (Exception e){

        }
    }
}

UDP

信息发送
发送端

//不需要连接服务器
public class UDPDemo1 {
    public static void main(String[] args) throws Exception {
        //建立一个socket
        DatagramSocket dgs=new DatagramSocket();

        //建立一个包
        String msg="hello,server!";

        //发送给谁
        InetAddress ad = InetAddress.getByName("localhost");
        int port=9090;
        //数据,数据的长度起始,连接对象地址,端口
        DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,ad,port);
        //发送包
        dgs.send(datagramPacket);

        //关闭流
        dgs.close();

    }

}

接收端

public class UDPDemo2 {
    public static void main(String[] args) throws Exception {

        //开放端口
        DatagramSocket socket=new DatagramSocket(9090);
        //接收数据包
        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
        socket.receive(packet);//阻塞接收,一直在监听等待

        System.out.println(packet.getAddress().getHostAddress());

        System.out.println(new String(packet.getData(),0,packet.getLength()));


        //关闭连接
        socket.close();


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值