JavaSE网络编程入门

Java网络编程入门

一、网络编程中的两个主要问题

1.如何准确地定位网络上一台或多台主机;定位主机上的特定的应用

2.找到主机后如何可靠高效地进行数据传输

二、网络编程中的两个要素

1.对应问题一:IP和端口号

2.对应问题二:提供网络通信协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路)

三、通信要素一:IP和端口号

1.IP的理解

1.IP:唯一的标识Interent上的计算机(通信实体)

2.在Java中使用InetAddress类表示IP

3.IP分类:IPv4和IPv6;万维网和局域网

4.域名:例如:www.baidu.com www.mi.com(IP地址过于难记,因此用实际的域名抽象IP地址 )

​ 域名解析:域名容易记忆,当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化成IP地址,这样才能和主机建立链接.

5.本地回路地址:127.0.0.1 对应方法:localhost

6.如何实例化InetAddress:两个方法:getByName(String host)、getLocalHost()两个常用方法:getHostName()/getHostAddress()

2.InetAddress类

理解:此类的对象就代表着一个具体的IP地址

1.实例化:getByName(String host)、getLocalHost()

2.常用方法:getHostName()/getHostAddress()

3.端口号

1.理解:正在计算机上运行的进程

要求:不同的进程有不同的端口号

范围:被规定为一个16位的整数 0~65535.

2.端口号与IP地址的组合得出一个网络套接字:Socket

四、通信要素二:网络通信协议

1.TCP协议

1.使用TCP协议前,必须先建立TCP连接,形成传输数据通道

2.传输前,采用“三次握手”方式,点对点通讯,是可靠的。

三次握手理解: **第一次握手->**我给小王发消息说我是鱼总,**第二次握手->**小王收到了我的消息说我知道你是鱼总,第三次握手->,我收到了小王的消息并知道了小王知道我是鱼总

套娃行为!!!!

3.TCP协议进行通信的两个应用进程:客户端、服务端

**客户端:**客户端(Client)又称为用户端,是指与服务器相对应,为客户提供本地服务的程序

服务器端:服务器端,从广义上讲,服务器是指网络中能对其它机器提供某些服务的计算机系统

4.在连接中可进行大数据量的传输

5.传输完毕,需要释放已建立的连接,但是效率比较低。

实例:打电话

2.实现TCP的网络编程
例一

客户端发送信息给服务端,服务端将数据显示在控制台上

代码实现:

/**
 * @author 一只鱼zzzz
 * @version 1.0
 */
public class TCPTest1 {
    @Test
    public void client() throws IOException {
        //指明对方IP
        InetAddress inet = InetAddress.getByName("127.0.0.1");
        //创建Socket对象,指明服务器端的ip和端口号,port:端口号
        Socket socket = new Socket(inet,8899);
        //获取一个输出流,用于输出数据
        OutputStream os = socket.getOutputStream();
        //写出数据操作
        os.write("你好,我是客户端mm".getBytes());
        //资源关闭
        os.close();
        socket.close();
    }

    @Test
    public void  server() throws IOException {
        //创建服务器端的socket,指明自己的端口号
        ServerSocket ss = new ServerSocket(8899);
        //用于接受来自客户端的socket
        Socket socket = ss.accept();
        //获取输入流
        InputStream is = socket.getInputStream();

        //不建议,可能出现乱码
//        byte[]buffer = new byte[20];
//        int len=0;
//        while((len=is.read(buffer))!=-1){
//            String str=new String(buffer,0,len);
//            System.out.println(str);
//        }
        //读取输入流中的数据
        //数据都存入到baos数组中,并且该数组会自动扩容
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[]buffer=new byte[5];
        int len=0;
        while((len=is.read(buffer))!=-1){
            baos.write(buffer,0, len);
        }
        System.out.println(baos.toString());
        //关闭资源
        baos.close();
        is.close();
        socket.close();
        ss.close();
    }

}
例二

客户端发送文件给服务器,服务端将文件保存在本地

代码实现:

/**
 * @author 一只鱼zzzz
 * @version 1.0
 */
public class TCPTest2 {

    @Test
    public  void client() throws IOException {
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"),9090);

        OutputStream os = socket.getOutputStream();

        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("zyb.jpg")));

        byte[] buffer = new byte[1024];
        int len;
        while((len=bis.read(buffer))!=-1){
            os.write(buffer,0,len);
        }
        bis.close();
        os.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
        ServerSocket serverSocket = new ServerSocket(9090);

        Socket socket = serverSocket.accept();

        InputStream is = socket.getInputStream();

        FileOutputStream fos = new FileOutputStream(new File("zyb2.jpg"));

        byte[]buffer = new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        fos.close();
        is.close();
        socket.close();
        serverSocket.close();
    }
}
例三

从客户端发送文件到服务端,服务端保存到本地。并返回“发送成功”给客户端,然后关闭相应连接

代码实现:

/**
 * @author 一只鱼zzz
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class TCPTest3 {

    @Test
    public void client() throws IOException {
        //创建Socket对象,指明服务器端的IP和端口号
        Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 1010);
        //获取一个输出流,用于输出数据
        OutputStream os = socket.getOutputStream();
        //将文件输入到程序
        FileInputStream fis = new FileInputStream(new File("zyb.jpg"));
        //读取输入流所输入的文件,并再输出出去
        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[]bufferr = new byte[20];
        int len1;
        while((len1=is.read(bufferr))!=-1){
            baos.write(bufferr,0,len1);
        }
        System.out.println(baos.toString());
        //关流
        baos.close();
        is.close();
        fis.close();
        os.close();
        socket.close();
    }

    @Test
    public void server() throws IOException {
        //创建服务器端的socket,指明端口号
        ServerSocket ss = new ServerSocket(1010);
        //接收来自客户端的socket
        Socket accept = ss.accept();
        //获取输入流
        InputStream is = accept.getInputStream();
        //输出流
        FileOutputStream fos = new FileOutputStream(new File("zyb3.jpg"));
        //读取输入流中的数据
        byte[]buffer=new byte[1024];
        int len;
        while((len=is.read(buffer))!=-1){
            fos.write(buffer,0,len);
        }
        System.out.println("图片传输完成");
        //服务器端给予客户端反馈
        OutputStream os = accept.getOutputStream();
        os.write("你好,帅哥,照片我已经收到,非常帅".getBytes());

        //关流
        os.close();
        fos.close();
        is.close();
        accept.close();
        ss.close();
    }
}
3.UDP协议

(不可靠连接)

1.将数据、源、目的封装成数据包,不需要建立连接

2.每个数据包的大小限制在64K内

3.发送不管对方是否准备好,接收方收到也不确定,所以是不可靠的

4.可以广播发送

5.发送数据时无需释放资源,开销小,速度快。

实例:发送短信,发送电报,直播。

代码实现:

/**
 * UDP协议的网络编程
 * @author 一只鱼zzzz
 * @version 1.0
 */
public class UDPTest {
    //发送端
    @Test
    public void sender() throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String str = "我是UDP方式发送的导弹";

        byte[]data=str.getBytes();
        InetAddress localHost = InetAddress.getLocalHost();

        //将数据都封装到DatagramPacket报中
        DatagramPacket packet = new DatagramPacket(data, 0, data.length, localHost,9090);
        socket.send(packet);

        socket.close();
    }

    //接收端
    @Test
    public void receiver() throws IOException {
        DatagramSocket datagramSocket = new DatagramSocket(9090);

        byte [] buffer = new byte[100];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);

        datagramSocket.receive(packet);

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

        datagramSocket.close();
    }
}

五、URL

1.TCP协议和UDP协议的区别

1.TCP是可靠的数据传输(三次握手),UDP是不可靠的数据传输。

2.TCP可以进行大数据量的传输,UDP每次都以数据报的形式发送,有限定大小。

3.TCP效率低,UDP效率高。

2.URL
(1)URL理解

统一资源定位符,对应着互联网上的某一个资源地址

(2)5个基本结构

http://localhost:8080/examples/zyb.jpg?username=Yu

协议 主机名 端口号 资源地址 参数列表

(3)实例化
URL url = new URL("http://192.168.14.100:8080/examples/hello.txt?username=Tom");
(4)常用方法

public String getProtocol()—>获取该URL的协议名

public String getHost()—>获取该URL的主机名

public String getPort() —>获取该URL的端口号

public String getPath()—>获取该URL的文件路径

public String getFile()—>获取该URL的文件名

public String getQuery()—>获取该URL的查询名

六、说点规划

Java网络编程入门只能解决一些很小的问题,面对真正的计算机网络技术这点知识显然是不够的,网络编程的进一步学习将会在接下来的JavaWeb中继续,目前我正在写一个基于JavaSE中的swing技术,多线程,IO流,网络编程,已经JDBC和MySQL基础技术实现一个多人联网的坦克大战小游戏,因此我会将复习的javase技术,SQL基础以及JDBC基础做成笔记发布记录,实现坦克大战之后我会将源码上传,可能还会出一期教程,目前是大一,加油吧!

你可能感兴趣的:(JavaSE,java,tcp/ip)