MEC@JavaSE@实战篇@笔记06@java中socket网络编程

一、网络编程入门

1、软件结构

网络编程就是计算机和计算机之间的数据交互。

C/S结构:

客户端/服务器: 微信 英雄联盟 tlias

优点:对网络要求低

缺点:需要下载和更新,占用空间大

B/S结构:

浏览器/服务器 : 淘宝 京东

优点:开发和使用方便

缺点:对网络要求高

2、网络编程三要素

IP地址

IP是网络中计算机的唯一标识。
​
IPV4:
    由32位二进制组成,一共可以分配40多亿个不重复的ip地址,这些IP已经不够全世界的使用了。
​
IPV6:
    由128位二进制组成,可以给地球上的每一粒沙子分配一个ip。
    
如何查看电脑ip:
    在命名行窗口中输入:  ipconfig
    
特殊ip写法:
    如果要表示本机ip,可以直接写ip数值,也可以用以下两个写法表示
        localhost
        127.0.0.1

端口号

端口号是软件的唯一标识,每个软件都有一个自己的端口号
​
取值范围:
    0 ~ 65535     其中0~1023范围建议留给系统软件使用

传输协议

协议是数据传输的方式
    TCP[学习]
        面向连接,数据发送安全,效率低
    UDP
        面向无连接,数据发送不安全,效率高,每个数据包最大64K

3、InetAddress类

代表IP,可以获取局域网中电脑的ip地址。

方法介绍

InetAddress类成员方法        
                static InetAddress getLocalHost() 
                                        获得本地主机IP地址对象        
                static InetAddress getByName(String host) 
                                        根据IP地址字符串或主机名获得对应的IP地址对象
​
                String getHostName()     获得主机名        
                String getHostAddress() 获得IP地址字符串

代码演示:

import java.net.InetAddress;
import java.net.UnknownHostException;
​
public class Test01 {
    public static void main(String[] args) throws UnknownHostException {
        //getLocalHost() : 获得本地主机IP地址对象
        //InetAddress ip = InetAddress.getLocalHost();
​
        //getByName(String host) :根据IP地址字符串或主机名获得对应的IP地址对象
        InetAddress ip = InetAddress.getByName("192.168.171.50");
​
        //String getHostName()     获得主机名
        String s1 = ip.getHostName();
        System.out.println(s1);               //DESKTOP-A119FQ3
​
        //getHostAddress() 获得IP地址字符串
        String s2 = ip.getHostAddress();
        System.out.println(s2);               //192.168.171.50
    }
}

3、TCP通信程序

1、TCP操作概述

在java中有Socket类,叫套接字,可以完成TCP方式数据传输。

2、TCP通信案例

客户端发送数据

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
​
public class Test客户端 {
    public static void main(String[] args) throws IOException {
​
        //创建客户端对象
        //第一个参数表示要连接的服务器的ip
        //第二个参数表示要连接的服务器的端口
        Socket s = new Socket("192.168.171.32",10000);
​
        //准备数据
        String str = "晚上11点我去你家~";
​
        //获取输出流
        OutputStream os = s.getOutputStream();
​
        //输出数据
        //把字符串变成字节数组输出
        os.write(str.getBytes());
​
        //关闭资源
        s.close();
    }
}

服务端接收数据

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
​
public class Test服务端 {
    public static void main(String[] args) throws IOException {
        //创建服务器对象
        //参数代表服务器自己的端口号
        ServerSocket ss = new ServerSocket(11002);
        //接受客户端连接
        Socket s = ss.accept();  //阻塞方法,如果连接不上就会一直等待
​
        //先创建一个字节数组准备接受数据
        byte[] bys = new byte[1024];
​
        //获取输入流
        //不管是客户端还是服务器,所有的流都使用Socket对象来获取
        InputStream is = s.getInputStream();
​
        //读取数据(因为服务器只发了一句话,一次读取即可。
        //不需要循环,并且也不能写循环,为什么不能后面说)
        int len = is.read(bys);  阻塞方法,如果读取不到就会一直等待
​
        //打印读取到的内容
        System.out.println(new String(bys, 0, len));
​
        //关闭资源
        //ss.close();   服务器是不需要关的
    }
}

3、模拟网络聊天

使用循环完成客户端和服务器端多次会话,因为代码的局限性,我们现在只能完成客户端和服务器一人一句的聊天。不能一个人一次发送多句话。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Test客户端 {
    public static void main(String[] args) throws IOException, InterruptedException {
​
        //创建客户端对象
        //第一个参数表示要连接的服务器的ip
        //第二个参数表示要连接的服务器的端口
        Socket s = new Socket("192.168.171.32",11002);
​
        while(true) {
            //发送数据
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
            OutputStream os = s.getOutputStream();
            os.write(str.getBytes());
​
​
            //接受数据
            byte[] bys = new byte[1024];
            InputStream is = s.getInputStream();
            int len = is.read(bys);
            System.out.println(new String(bys, 0, len));
​
        }
        //关闭资源
        //s.close();
    }
}
​
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class Test服务端 {
    public static void main(String[] args) throws IOException {
​
        //创建服务器对象
        //参数代表服务器自己的端口号
        ServerSocket ss = new ServerSocket(11002);
​
        //接受客户端连接
        Socket s = ss.accept();
​
        while(true) {
            //读取数据
            byte[] bys = new byte[1024];
            InputStream is = s.getInputStream();
            int len = is.read(bys);
            System.out.println(new String(bys, 0, len));
​
            //发送数据
            Scanner sc = new Scanner(System.in);
            String str = sc.nextLine();
            OutputStream os = s.getOutputStream();
            os.write(str.getBytes());
​
            //关闭资源
            //ss.close();   服务器是不需要关的
        }
    }
}
​

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值