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基础做成笔记发布记录,实现坦克大战之后我会将源码上传,可能还会出一期教程,目前是大一,加油吧!
版权归原作者 一只鱼zzzz 所有, 如有侵权,请联系我们删除。