A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yuchun 中级黑马   /  2015-8-2 19:58  /  350 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

网络编程
网络模型:
OSI参考模型
TCP/IP参考模型

网络通讯要素:
IP地址(网络中设备的标识)
端口号(标识进程中的逻辑地址)
传输协议(TCP,UDP)

IP对象:InetAddress()
import java.net.*;
class  IPDemo
{
        public static void main(String[] args) throws Exception
   {
                //通过名称(ip字符串or主机名)来获取一个ip对象。
                InetAddress ip = InetAddress.getByName("www.baidu.com");
                System.out.println("addr:"+ip.getHostAddress());
                System.out.println("name:"+ip.getHostName());
        }
}
Socket(套接字,通信的端点)
1、为网络服务提供的一种机制
2、通信的两端都有Socket
3、网络通信其实就是Socket间的通信
4、数据在两个Socket间通过IO传输

1,只要是网络传输,必须有socket 。
2,数据一定要封装到数据包中,数据包中包括目的地址、端口、数据等信息。


UDP传输:
特点:
1、将数据及源和目的封装成数据包(DatagramSocket)中,不需要建立连接;
2、每个数据报的大小限制在64K内
3、不需要建立连接,速度快
4、因为是无连接,所以UDP协议是不可靠协议

udp的发送端:
1,建立updsocket服务。
2,提供数据,并将数据封装到数据包中。
3,通过socket服务的发送功能,将数据包发出去。
4,关闭资源。

示例:
import java.net.*;
class  UdpSend
{
        public static void main(String[] args) throws Exception
        {
                //1,创建udp服务。通过DatagramSocket对象。
                DatagramSocket ds = new DatagramSocket(8888);

                //2,确定数据,并封装成数据包。
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
                byte[] buf = "udp ge men lai le ".getBytes();
                DatagramPacket dp =
         new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.1.254"),10000);

                //3,通过socket服务,将已有的数据包发送出去。通过send方法。
                ds.send(dp);

                //4,关闭资源。
                ds.close();
        }
}

udp的接收端:
1,定义udpsocket服务。通常会监听一个端口。其实就是给这个接收网络应用程序定义数字标识。
        方便于明确哪些数据过来该应用程序可以处理。
2,定义一个数据包,因为要存储接收到的字节数据。因为数据包对象中有更多功能可以提取字节数据中的不同数据信息。
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中。
4,通过数据包对象的特有功能。将这些不同的数据取出。打印在控制台上。
5,关闭资源。

示例:
class  UdpRece
{
        public static void main(String[] args) throws Exception
        {
                //1,创建udp socket,建立端点。
                DatagramSocket ds = new DatagramSocket(10000);
                while(true)
                {
                //2,定义数据包。用于存储数据。
                byte[] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);

                //3,通过服务的receive方法将收到数据存入数据包中。
                ds.receive(dp);//阻塞式方法。

                //4,通过数据包的方法获取其中的数据。
                String ip = dp.getAddress().getHostAddress();
                String data = new String(dp.getData(),0,dp.getLength());
                int port = dp.getPort();
                System.out.println(ip+"::"+data+"::"+port);
                }

                //5,关闭资源
                ds.close();

        }
}

TCP传输:
特点:
1、建立连接,形成传输数据的通道
2、在连接中进行大数据量传输
3、通过三次握手完成连接,是可靠协议
4、因为必须建立连接,所以效率会稍低

tcp的两个端点:一个是客户端,一个是服务端。
客户端:对应的对象,Socket
服务端:对应的对象,ServerSocket

TCP客户端:
1,建立tcp的socket服务,最好明确具体的地址和端口。这个对象在创建时,就已经可以对指定ip和端口进行连接(三次握手)。
2,如果连接成功,就意味着通道建立了,socket流就已经产生了。只要获取到socket流中的读取流和写入流即可,只要通过getInputStream和getOutputStream就可以获取两个流对象。
3,关闭资源。

     示例
import java.net.*;
import java.io.*;
//需求:客户端给服务器端发送一个数据。
class  TcpClient{
        public static void main(String[] args) throws Exception{

//创建客户端的socket服务。指定目的主机和端口
                Socket s = new Socket("192.168.1.254",10003);
//为了发送数据,应该获取socket流中的输出流。
                OutputStream out = s.getOutputStream();
                out.write("TCP yan shi".getBytes());
                //关闭资源
s.close();
        }
}


TCP服务端:
1,建立服务端的socket服务ServerSocket(),并监听一个端口
2,通过ServerSokcet的 accept方法获取连接过来的客户端对象。如果没有连接就会等,所以这个方法阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据。
4,关闭服务端。(可选)注意:要先关客户端,再关服务端。

    示例
    class  TcpServer
   {
        public static void main(String[] args) throws Exception
        {
                //建立服务端socket服务。并监听一个端口。
                ServerSocket ss = new ServerSocket(10003);

                //通过accept方法获取连接过来的客户端对象。
                while(true)
                {
                    Socket s = ss.accept();
                    String ip = s.getInetAddress().getHostAddress();
                    System.out.println(ip+".....connected");

                   //获取客户端发送过来的数据,那么要使用客户端对象的读取流来读取数据。
                    InputStream in = s.getInputStream();
                   byte[] buf = new byte[1024];
                   int len = in.read(buf);
                   System.out.println(new String(buf,0,len));
                   s.close();//关闭客户端.
                }
                //ss.close();
        }
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马