Java网络编程

来源:互联网 发布:c语言fabs函数确定精读 编辑:程序博客网 时间:2024/05/21 16:59

1.网络编程基础知识:

   网络编程是直接或间接通过网络协议与其他计算机进行通讯。   网络编程中有两个问题:如何精准找到网络上要通讯的主机;在找到主机后如何进行数据传输。   在TCP/IP协议中,IP层主要负责网络主机的定位,数据传输的路由,由IP地址唯一确定网络上的一台主机;   而TCP层则提供面向应用的可靠或非可靠的数据传输机制,这是网络编程的主要对象,一般不需要关心IP层如何处理数据。

2.传输协议:TCP/UDP

 尽管TCP/IP协议中名称只有TCP这个协议名,但是在TCP/IP的传输层同时存在TCP和UDP这两个协议。   在建立连接后,可以进行大数据量的传输。通过TCP协议传输时,发送方和接收方的成对的两个 socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个Socket(通常是Server Socket)  等待连接时,另一个Socket可以要求连接,一旦这两个Socket连接起来,它们就可以进行双向数据传输,  双方都可以进行数据的发送和接收操作。这种通讯和我们日常生活中打电话通讯十分类似。UDP(User Datagram Protocol):是一种面向无连接的传输协议,这种通讯和我们日常生活中邮寄信件非常类似, 将数据、数据源以及目的地封装成数据包中进行传输,由于不需要建立连接,所以传输效率会稍微高点, 但是无法保证数据包会一定到达目的地、数据的可靠性、以及时间上的次序,是一种不可靠的协议。 使用UDP传输数据时是有大小限制的,每个数据包的大小限制在64k内。

3.java网络编程

java中的网络编程其实就是指Socket编程,Socket是为网络服务提供的一种机制,在通信两端都有Socket,数据在两个Socket间进行IO传输。

3.1. IP地址:IP地址是网络中设备的标识,用来定位网络主机,在java中IP地址被封装成InetAddress对象。

static InetAddress[] getAllByName(String host);        在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组。static InetAddress getByAddress(byte[] addr);         在给定原始 IP 地址的情况下,返回 InetAddress 对象。static InetAddress getByAddress(String host ,byte[] addr);  根据提供的主机名和 IP 地址创建 InetAddressstatic InetAddress getByName(String host);         在给定原始 IP 地址的情况下,返回 InetAddress 对象。static InetAddress getLocalHost();   返回本地主机String getHostAddress();    返回 IP 地址字符串(以文本表现形式)String getHostName();       获取此 IP 地址的主机名byte[] getAddress();        返回此 InetAddress 对象的原始 IP 地址

3.2. 使用UDP建立Socket服务进行传输数据

 1)使用到的对象:      DatagramSocket: 用来发送和接收数据报包的套接字      DatagramPacket: 数据报包       使用UDP协议发送数据:        步骤:a.建立UDPSocket服务;              b.提供数据,并将数据封装到数据报中;              c.通过Socket服务的发送功能,将数据报发送出去;              d.关闭资源;    import java.net.DatagramPacket;    import java.net.DatagramSocket;    import java.net.InetAddress;    public class UdpSendDemo{        public static void main(String[] args) throws Exception {            //1.创建UDP服务,端口号有系统指定            DatagramSocket ds = new DatagramSocket();            //2.确定数据,并封装成数据报,将数据发送到本机,用端口号10000处理            byte[] buf = "使用UDP发送数据".getBytes();            DatagramPacket dp = new DatagramPacket(buf, buf.length ,InetAddress.getLocalHost() , 10000);            //3.使用socket服务将数据报发送出去            ds.send(dp);            //4.关闭资源            ds.close();        }    }使用UDP协议接收数据import java.net.DatagramPacket;import java.net.DatagramSocket;public class UdpReceiveDemo {    public static void main(String[] args)throws Exception {        //1.创建UDP服务,监听端口号10000        DatagramSocket ds = new DatagramSocket(10000);        //2.创建接收数据的数据报        byte[] buf = new byte[1024];        DatagramPacket dp = new DatagramPacket(buf, buf.length);        //3.通过socket服务接收数据存入定义好的数据报中,receive()方法是阻塞式的        ds.receive(dp);        //4.通过数据报获取数据        System.out.println("IP: " + dp.getAddress().getHostAddress() + "  端口号  "                 + dp.getPort() + "  内容: " + new String(dp.getData()).trim());          //5.关闭资源        ds.close();    }}

3.3使用TCP传输数据:

1).使用到的对象:    Socket:         实现客户端套接字    ServerSocket:   实现客户端套接字//客户端代码    import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.Socket;public class TcpClientDemo {    public static void main(String[] args)throws Exception {        //1.创建Socket服务,并指定要连接的地址和端口        Socket socket = new Socket(InetAddress.getLocalHost() , 10000);        //2.获取输入流,写入数据,发送到服务端        OutputStream os = socket.getOutputStream();        os.write("Socket客户端使用Tcp发送数据".getBytes());        //3.获取输出流,读取服务端发送过来的数据        InputStream is = socket.getInputStream();        byte[] buf = new byte[1024];        int len = is.read(buf);        System.out.println(new String(buf ,0 , len));        //4.关闭资源        socket.close();    }}//服务端代码import java.io.InputStream;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class TcpServerDemo {    public static void main(String[] args) throws Exception{        //1.建立服务端socket        ServerSocket ss = new ServerSocket(10000);        //2.接收客户端Socket, 该方法是阻塞式的        Socket s = ss.accept();        //3.读取客户端发送的数据        InputStream is = s.getInputStream();        byte[] buf = new byte[1024];        int len = is.read(buf);        System.out.println(new String(buf,0 , len));        //4.给客户端发送数据        OutputStream os = s.getOutputStream();        os.write("服务端发送数据到客户端".getBytes());        //5.关闭服务        s.close();        ss.close();    }}

4.基于URL高层次的Java网络编程
URL代表统一资源定位符,它表示Internet上某一资源的地址。

使用URL连接网络上的资源    URL url = new URL("http://www.baidu.com");    HttpURLConnection conn = (HttpURLConnection) url.openConnection();    conn.setRequestMethod("GET"); // 设置请求方式为get方式    conn.setReadTimeout(5000);  //设置读取时间为5s    conn.setConnectTimeout(5000); //设置连接超时时间    conn.connect();   // 开始连接    if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){ // 根据返回码判断是否连接成功        byte[] buf = new byte[1024];        int len = 0;        ByteArrayOutputStream bos = new ByteArrayOutputStream();        InputStream in = conn.getInputStream();        while((len= in.read(buf)) != -1){            bos.write(buf , 0 , len);        }        System.out.println(bos.toString());        bos.close();    }    conn.disconnect();   //断开连接

参考博客:http://www.cnblogs.com/linjiqin/archive/2011/06/10/2077237.html

1 0
原创粉丝点击