18Java语法回顾之网络编程

Java语法回顾之网络编程


读了那么多年的书让我明白一个道理。人要稳重,不要想到啥就做啥。做一行越久即使你不会,几年之后慢慢的你也会了,加上一点努力你或许你能成为别人眼中的专家。

InetAddress类的学习

/**
 * InetAddress:表示IP地址。
 *
 * 没有构造方法,想到那些问题呢?
 * A:成员都是静态的。
 * B:肯定有静态方法返回该类的对象。
 *
 * 通过查看API,我们找到了一个有意义的:
 * public static InetAddress getByName(String host)
 *
 * 成员方法:
 *      IP地址:public String getHostAddress()
 *      主机名:public String getHostName()
 */
public class MyInetAddress {
    public static void main(String[] args){
        InetAddress localHost = null;
        try {
        //通过getLocalHost()获取InetAddress对象
            localHost = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        String hostAddress = localHost.getHostAddress();
        String hostName = localHost.getHostName();
        System.out.println("本机IP地址:"+hostAddress+"本机名称:"+hostName);
    }
}

DatagramSocket类的学习

/**
 * UDP协议发送数据步骤:
 * A:创建发送端Socket服务对象
 * B:创建数据,并把数据打包
 * C:发送数据
 * D:释放资源
 */

 /**
 * UDP协议接收数据步骤:
 * A:创建接收端Socket服务对象
 * B:创建数据包(接收容器)
 * C:调用接收方法
 * D:解析数据包,把数据显示在控制台
 * E:释放资源
 * <p/>
 * 注意:
 * A:端口一定要一致。
 * B:Exception in thread "main" java.net.BindException:
 * Address already in use: Cannot bind
 */

DatagramSocket类的学习代码测试

//发送端

public class SendDemo {
    public static void main(String[] args) throws IOException {
        // 创建发送端Socket服务对象
        DatagramSocket ds = new DatagramSocket();

        // 创建数据,并把数据打包
        String str = "hello,udp,我来了";
        // public DatagramPacket(byte[] buf,int length,InetAddress address,int
        // port)
        byte[] bys = str.getBytes();
        int length = bys.length;
        InetAddress address = InetAddress.getByName("192.168.3.172");
        int port = 12306;
        DatagramPacket dp = new DatagramPacket(bys, length, address, port);

        // 发送数据
        // public void send(DatagramPacket p)
        ds.send(dp);

        // 释放资源
        ds.close();
    }
}

//接收端
public class ReceiveDemo {
    public static void main(String[] args) throws IOException {
        // 创建接收端Socket服务对象
        // DatagramSocket(int port)
        DatagramSocket ds = new DatagramSocket(12306);

        // 创建数据包(接收容器)
        // public DatagramPacket(byte[] buf,int length)
        byte[] bys = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bys, bys.length);

        // 调用接收方法
        // public void receive(DatagramPacket p)
        ds.receive(dp);

        // 解析数据包,把数据显示在控制台
        // public InetAddress getAddress()
        InetAddress address = dp.getAddress();
        String ip = address.getHostAddress();

        // public byte[] getData()
        byte[] bys2 = dp.getData();
        // public int getLength()
        int length = dp.getLength();

        String s = new String(bys2, 0, length);
        System.out.println(ip + "***" + s);

        // 释放资源
        ds.close();
    }
}

发送数据,来自于键盘录入

/**
 * 需求:发送数据,来自于键盘录入。
 * 发送端
 */
public class MySend {
    public static void main(String[] args) throws IOException {
        //创建socket对象
        DatagramSocket ds = new DatagramSocket();
        //创建数据包,来源键盘录入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while ((line = br.readLine()) != null) {
            if ("886".equals(line)) {
                break;
            }
            byte[] bytes = line.getBytes();
            int length = bytes.length;
            //发送数据
            DatagramPacket dp = new DatagramPacket(bytes, length, InetAddress.getByName("192.168.1.100"), 12306);
            ds.send(dp);
        }
        ds.close();
    }
}

/**
 * 接收端
 */
public class MyReceive {
    public static void main(String[] args) throws IOException {
        //创建socket对象,端口必须一致
        DatagramSocket ds = new DatagramSocket(12306);
        while(true){
            byte[] bytes = new byte[1024];
            int length = bytes.length;
            //创建数据包
            DatagramPacket dp = new DatagramPacket(bytes,length);
            ds.receive(dp);
            String ip = dp.getAddress().getHostAddress();
            String str = new String(dp.getData(),0,dp.getLength());
//            if ("886".equals(str)){
//                System.out.println("886");
//                System.exit(10);
//            }
            System.out.println(str+ip+"哈哈哈");

        }
    }
}

基于TCP的socket通信演示

/**
 * 基于TCP的Server端
 * 1.创建socket对象
 * 2.建立连接
 * 3.获取输入流数据,并显示控制台
 * 4.释放资源
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket
        ServerSocket ss = new ServerSocket(12306);
        //监听连接
        Socket s = ss.accept();
        //通过监听连接,获取socket对象,通过socket对象获取输入流
        InputStream is = s.getInputStream();
        //通过输入流,读取数据并显示
        byte[] bys = new byte[1024];
        int len = is.read(bys);
        String str = new String(bys, 0, len);
        System.out.println(str);
        //释放资源
        s.close();
        //不要关闭ServerSocket资源,用于监听其他连接
//        ss.close();
    }
}


/**
 * 基于TCP通信协议的聊天客户端
 *
 * 1.创建socket对象,并选择ip和端口
 * 2.建立连接
 * 3.创建输入流,写入数据
 * 4.释放资源
 */
public class MyClient {
    public static void main(String[] args) throws IOException {
        Socket s = new Socket("192.168.1.30",12306);
        //获取输入流,写入数据
        OutputStream os = s.getOutputStream();
        //写入数据
        byte[] bytes = "哈哈,我来咯".getBytes();
        os.write(bytes,0,bytes.length);
        //关闭资源
        s.close();
    }
}

TCP协议的socket综合练习


/*
 * 需求:客户端发送消息,服务器用文本接受,当消息接受完成,给客户端反馈一条消息。
 * 写数据,数据进去了,但是反馈没有成功。
 * 原因:就是因为服务器不知道你已经写完了。
 * 
 * 怎么解决?告诉服务器我写完了。
 * 怎么告诉:
 * A:自定义接收标记    假如有一个数据叫886,就出事了。
 * B:Socket提供了一个方法,来通知我接收了。
 *      public void shutdownOutput()
 */
public class MyServer {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket ss = new ServerSocket(12306);
        //监听连接
        Socket s = ss.accept();
        //把接受的字符存入文本文件,首先创建文件,因为是每次接受一行用BufferedWriter
        BufferedWriter bw = new BufferedWriter(new FileWriter("Server.txt",true));
        //通过socket对象获取输出流,并用BufferedReader封装每次读一行数据
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        String line = null;
        while((line = br.readLine())!= null){
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        if(line == null){
            //如果line等于null,就给client反馈一条信息
            BufferedWriter bw2 = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
            bw2.write("服务器数据接受完成");
            bw2.flush();
//            bw2.close();
            System.out.println("我就打印一句话");
        }
        s.close();
    }
}

public class MyClient {
    public static void main(String[] args) throws IOException {
        //创建socket对象
        Socket s = new Socket("192.168.1.102",12306);
        //封装键盘录入
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        //获取输出流对象
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
        String line = null;
        while((line = br.readLine())!=null){
            if("over".equals(line)){
                break;
            }
            bw.write(line);
            bw.newLine();
            bw.flush();
        }
        //消息录入完毕的标记
        s.shutdownOutput();
        //从服务器获取到反馈信息
        BufferedReader br2 = new BufferedReader(new InputStreamReader(s.getInputStream()));
        System.out.println(br2.readLine()+"O(∩_∩)O哈哈~");
//        br2.close();
        br.close();
        s.close();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值