黑马程序员_java网络编程

来源:互联网 发布:淘宝店铺首页装修代码 编辑:程序博客网 时间:2024/06/04 20:09

------- android培训、java培训、期待与您交流! ----------

网络编程

网络编程就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换。

网络模型

计算机网络之间以何种规则进行通信,就是网络模型研究问题。

网络模型一般是指OSIOpen System Interconnection开放系统互连)参考模型,TCP/IP参考模型。

网络模型七层概述:物理层,数据链路层,网络层,传输层,会话层,表示层和应用层。


网络通信三要素

IP地址:InetAddress,网络中设备的标识,不易记忆,可用主机名。

端口号:用于标识进程的逻辑地址,不同进程的标识。

传输协议:通讯的规则,常见协议TCPUDP

InetAddress类的使用:获取任意主机:getByName

主机名:getHostName

主机Ip地址:getHostAddress

端口号:物理端口:网卡口;

逻辑端口:每个网络程序都会至少有一个逻辑端口;

  用于标识进程的逻辑地址,不同进程的标识;

  有效端口:0~65535,其中0~1024系统使用或保留端口。

传输协议:TCP,建立连接,形成传输数据的通道;在连接中进行大数据量传输;通过   三次握手完成连接,是可靠协议;必须建立连接,效率会稍低。

     UDP,将数据源和目的封装成数据包中,不需要建立连接;每个数据报的大   小在限制在64k;因无连接,是不可靠协议;不需要建立连接,速度快。


Socket套接字

网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

Socket原理机制:

通信的两端都有Socket

网络通信其实就是Socket间的通信。

数据在两个Socket间通过IO传输。


UDP传输:

DatagramSocketDatagramPacket

建立发送端,接收端。

建立数据包。

调用Socket的发送接收方法。

关闭Socket

发送端与接收端是两个独立的运行程序。

UDP传输-发送端思路:

1:建立udpsocket服务

2:将要发送的数据封装成数据包

3:通过udpsocket服务,将数据包发送出

4:关闭资源

代码如下:

import java.net.*;public class UDPSend {public static void main(String[] args) throws Exception{//创建数据包对象DatagramPacketbyte[] bytes = "UDP我来了".getBytes();DatagramPacket dp = new DatagramPacket(bytes, bytes.length,InetAddress.getByName("127.0.0.1"),8000);//创建投递数据包对象DatagramSocketDatagramSocket ds = new DatagramSocket(4000);//调用投递数据包对象方法sendds.send(dp);//关闭资源ds.close();}}

UDP传输-接收端思路

1:建立udpsocket服务.

2:通过receive方法接收数据

3:将收到的数据存储到数据包对象中

4:通过数据包对象的功能来完成对接收到数据进行解析.

5:可以对资源进行关闭

代码如下:

import java.net.*;public class UDPReceive {public static void main(String[] args)throws Exception {//定义字节数组byte[] bytes = new byte[1024];//创建投递包,接收包服务对象DatagramSocket,传递端口号DatagramSocket ds = new DatagramSocket(8000);while(true){//创建数据包对象,接收对方发来的数据包DatagramPacket dp = new DatagramPacket(bytes, bytes.length);//调用投递包对象方法receive接收数据包ds.receive(dp);//拆包//获取发送的字节数组有效长度int length = dp.getLength();//获取发送端IP地址String ip = dp.getAddress().getHostAddress();//获取发送的端口号int port = dp.getPort();//输出接收的字节数组System.out.println(new String(bytes,0,length)+".."+ip+".."+port);}//ds.close();}}

TCP传输

SocketServerSocket

建立客户端和服务器端;

建立连接后,通过Socket中的IO流进行数据的传输;

关闭socket

同样,客户端与服务器端是两个独立的应用程序。

客户端思路:

1:建立客户端的Socket服务,并明确要连接的服务器。

2:如果连接建立成功,就表明,已经建立了数据传输的通道.就可以在该通道通过IO进行数据的读取和写入.该通道称为Socket,Socket流中既有读取流,也有写入流。

3:通过Socket对象的方法,可以获取这两个流。

4:通过流的对象可以对数据进行传输。

5:如果传输数据完毕,关闭资源。

代码如下:

import java.net.*;import java.io.*;public class TCPClient {public static void main(String[] args)throws Exception {//创建客户端连接对象,连接服务器Socket s = new Socket("192.168.33.55", 8000);//读取键盘数据BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));//通过客户端连接对象,获取字节输出流向服务器发送数据//OutputStream out = s.getOutputStream();//打印流,简化操作 PrintWriter(任何流数据目的)PrintWriter out = new PrintWriter(s.getOutputStream(),true);String line = null;while((line = bfr.readLine())!=null){if("over".equals(line))break;//发送服务器out.println(line);}bfr.close();s.close();}}

服务端思路:

1:建立服务器端的socket服务,需要一个端口。

2:服务端没有直接流的操作,而是通过accept方法获取客户端对象,在通过获取到的客户端对象的流和客户端进行通信。

3:通过客户端的获取流对象的方法,读取数据或者写入数据。

4:如果服务完成,需要关闭客户端,然后关闭服务器,但是,一般会关闭客户端,不会关闭服务器,因为服务端是一直提供服务的。

代码如下:

import java.net.*;import java.io.*;public class TCPServer {public static void main(String[] args) throws Exception{//创建服务器连接对象,打开8000端口ServerSocket ss = new ServerSocket(8000);//获取客户端连接对象Socket s = ss.accept();//读取客户端数据,客户端连接对象获取字节输入流//InputStream in = s.getInputStream();//发送的字符文本,字节流直接读不方便,转成字符流BufferedReader bfrIn = new BufferedReader(new InputStreamReader(s.getInputStream()));//循环读取客户端数据String line = null;while((line = bfrIn.readLine())!=null){System.out.println(line.toUpperCase());}s.close();ss.close();}}



1 0
原创粉丝点击