0


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
 */publicclassTCPTest1{@Testpublicvoidclient()throwsIOException{//指明对方IPInetAddress inet =InetAddress.getByName("127.0.0.1");//创建Socket对象,指明服务器端的ip和端口号,port:端口号Socket socket =newSocket(inet,8899);//获取一个输出流,用于输出数据OutputStream os = socket.getOutputStream();//写出数据操作
        os.write("你好,我是客户端mm".getBytes());//资源关闭
        os.close();
        socket.close();}@Testpublicvoidserver()throwsIOException{//创建服务器端的socket,指明自己的端口号ServerSocket ss =newServerSocket(8899);//用于接受来自客户端的socketSocket 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 =newByteArrayOutputStream();byte[]buffer=newbyte[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
 */publicclassTCPTest2{@Testpublicvoidclient()throwsIOException{Socket socket =newSocket(InetAddress.getByName("127.0.0.1"),9090);OutputStream os = socket.getOutputStream();BufferedInputStream bis =newBufferedInputStream(newFileInputStream(newFile("zyb.jpg")));byte[] buffer =newbyte[1024];int len;while((len=bis.read(buffer))!=-1){
            os.write(buffer,0,len);}
        bis.close();
        os.close();
        socket.close();}@Testpublicvoidserver()throwsIOException{ServerSocket serverSocket =newServerSocket(9090);Socket socket = serverSocket.accept();InputStream is = socket.getInputStream();FileOutputStream fos =newFileOutputStream(newFile("zyb2.jpg"));byte[]buffer =newbyte[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"})publicclassTCPTest3{@Testpublicvoidclient()throwsIOException{//创建Socket对象,指明服务器端的IP和端口号Socket socket =newSocket(InetAddress.getByName("127.0.0.1"),1010);//获取一个输出流,用于输出数据OutputStream os = socket.getOutputStream();//将文件输入到程序FileInputStream fis =newFileInputStream(newFile("zyb.jpg"));//读取输入流所输入的文件,并再输出出去byte[]buffer=newbyte[1024];int len;while((len=fis.read(buffer))!=-1){
            os.write(buffer,0,len);}//关闭数据的输出
        socket.shutdownOutput();//接收来自于服务器端的数据,并显示到控制台上InputStream is = socket.getInputStream();ByteArrayOutputStream baos =newByteArrayOutputStream();byte[]bufferr =newbyte[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();}@Testpublicvoidserver()throwsIOException{//创建服务器端的socket,指明端口号ServerSocket ss =newServerSocket(1010);//接收来自客户端的socketSocket accept = ss.accept();//获取输入流InputStream is = accept.getInputStream();//输出流FileOutputStream fos =newFileOutputStream(newFile("zyb3.jpg"));//读取输入流中的数据byte[]buffer=newbyte[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
 */publicclassUDPTest{//发送端@Testpublicvoidsender()throwsIOException{DatagramSocket socket =newDatagramSocket();String str ="我是UDP方式发送的导弹";byte[]data=str.getBytes();InetAddress localHost =InetAddress.getLocalHost();//将数据都封装到DatagramPacket报中DatagramPacket packet =newDatagramPacket(data,0, data.length, localHost,9090);
        socket.send(packet);

        socket.close();}//接收端@Testpublicvoidreceiver()throwsIOException{DatagramSocket datagramSocket =newDatagramSocket(9090);byte[] buffer =newbyte[100];DatagramPacket packet =newDatagramPacket(buffer,0,buffer.length);

        datagramSocket.receive(packet);System.out.println(newString(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基础做成笔记发布记录,实现坦克大战之后我会将源码上传,可能还会出一期教程,目前是大一,加油吧!

标签: java tcp/ip

本文转载自: https://blog.csdn.net/zyb_020826/article/details/123877534
版权归原作者 一只鱼zzzz 所有, 如有侵权,请联系我们删除。

“JavaSE网络编程入门”的评论:

还没有评论