Java笔记-网络编程

Java笔记-网络编程

TCP:打电话

UDP:发短信

网络协议:http、ftp、tcp、udp

OSI七层网络模型TCP/IP四层概念模型对应网络协议
应用层HTTP、TFTP、FTP、NFS、SMTP
表示层Telnet、Rlogin、SNMP、Gopher
会话层SMTP、DNS
传输层传输层TCP、UDP
网络层网络层IP、ICMP、ARP
数据链路层数据链路层FDDI、PDN、PPP
物理层数据链路层IEEE802.1A

IP:InetAddress

  • ipv4/ipv6: ipv4由4个字节组成0~255 ;ipv6 128位,8个无符号整数组成
  • 公网/私网

端口:0-65535

  • http:8080
  • Https: 443
  • FTP:21
  • Telnet:23
  • Tomcat:8080
  • Mysql:3306
  • Oracle:1521

TCP

打电话

三次握手 四次挥手

传输完成,释放连接

//TCP通话客户端
public class testClientSocket {
    public static void main(String[] args) throws IOException {
        int port = 9999;
        InetAddress address = null;
        Socket socket = null;
        OutputStream out = null;
        ByteArrayOutputStream output = null;
        InputStream in = null;
        try{
            //知道地址,建立通信
            address = InetAddress.getByName("127.0.0.1");
            socket = new Socket(address,port);

            //输出信息
            out = socket.getOutputStream();

            out.write("客户端:你好呀服务器端,我是客户端".getBytes());

 //通知服务器端已经结束嘞
            socket.shutdownOutput();

             in = socket.getInputStream();
             output = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while((len = in.read(buffer)) != -1){
                output.write(buffer,0,len);
            }
            System.out.println(output.toString());

        }finally {

            if(output !=null){
                output.close();
            }
            if(in !=null){
                in.close();
            }
            if(out != null){
                out.close();
            }
            if(socket != null){
                socket.close();
            }



        }


    }
}



//服务器端
public class testServerSocket {
    public static void main(String[] args) throws IOException {

        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream in = null;
        ByteArrayOutputStream byteStream = null;
        OutputStream output = null;
        try{
            //声明自己的端口号
            serverSocket = new ServerSocket(9999);

            //接受客户端端的socket
            socket = serverSocket.accept();

            //获取客户端的数据
            in = socket.getInputStream();

                byteStream = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len;
                while((len=in.read(buffer))!=-1){
                    byteStream.write(buffer,0,len);
                }
                System.out.println(byteStream.toString());


                //反馈给客户端
            output = socket.getOutputStream() ;
            output.write("服务器端:亲爱的客户端,服务器端已收到".getBytes());


        }finally {
            output.close();
            byteStream.close();
            in.close();
            socket.close();
            serverSocket.close();
        }


    }
}

UDP

发短信

客户端和服务端没有明确界定

不管有没有准备好,都要发送

//发送端
public class testUDP {
    public static void main(String[] args) throws IOException {
        //建立socket
        DatagramSocket socket = new DatagramSocket();

        String msg = "你好";
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port = 9090;
        DatagramPacket packet = new DatagramPacket(msg.getBytes(),0,msg.getBytes().length,address,port);

        //发送包
        socket.send(packet);
        socket.close();
    }
}

//接收端

public class testToUDP {
    public static void main(String[] args) throws IOException {
        DatagramSocket socket = new DatagramSocket(9090);

        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        socket.receive(packet);


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

循环聊天

//UDP协议发送者
public class UDPSend implements  Runnable{
    DatagramSocket socket = null;
    DatagramPacket packet = null;

     BufferedReader reader = null;

    int fromPort ;
    String toIP ;
    int toPort ;

    public UDPSend(String toIP , int fromPort, int toPort)  {
       this.toIP = toIP;
        this.fromPort = fromPort;
        this.toPort = toPort;
        try {
            socket = new DatagramSocket(fromPort);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        reader = new BufferedReader(new InputStreamReader(System.in));

    }


    @Override
    public void run() {
        //发送信息
        try {

            while(true){
                String data = reader.readLine().trim();
                byte[] datas = data.getBytes();

                packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress(this.toIP,this.toPort));

                socket.send(packet);
                if(data.equals("bye")){
                    break;
                }

            }


        } catch (SocketException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            socket.close();

        }

    }
}

//UDP接收
public class UDPRecieve implements  Runnable{

    DatagramSocket socket ;
    DatagramPacket packet ;
    private int fromPort;
    private int port;
    private String msgFrom;

    public UDPRecieve(int fromPort, int port,String msgFrom) {
        this.msgFrom = msgFrom;
        this.fromPort = fromPort;
        this.port = port;
        try {
            socket = new DatagramSocket(this.port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        try {
            while(true){
                byte[] buffer = new byte[20];

                packet = new DatagramPacket(buffer,0,buffer.length);

                socket.receive(packet);

                byte[] data = packet.getData();
                String receiveData = new String(data,0,data.length);

                System.out.println(this.msgFrom  +":"+receiveData);
                if(receiveData.equals("bye")){
                    break;
                }
            }


        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            socket.close();

        }


    }
}

//开启两个线程,一个人可以接收和发送,开两个端口
//另外一个人也接收和发送,也开两个端口
public class testUser1 {
    public static void main(String[] args) {
        new Thread(new UDPSend("127.0.0.1",1111,2222)).start();
        new Thread(new UDPRecieve(3333,4444,"User2")).start();
    }
}

public class testUser2 {
    public static void main(String[] args) {
        new Thread(new UDPSend("127.0.0.1",3333,4444)).start();
        new Thread(new UDPRecieve(1111,2222,"User1")).start();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值