黑马程序员--java基础之网络编程(Socket编程)(一)

一、网络通讯要素

1、IP地址:1) 网络中设备的标识,通过找到对方IP地址进行访问;

                     2) 因为IP地址不方便记忆,所以可以用主机名访问。

                       比如www.baidu.com,其中baidu就是主机名,www表示该主机是万维网组织的注册用户,后面的.com代表商业用途的网站

                       如果是.org则代表教育方面的网站,一般是免费的。

                     3) 在java中提供了专门的操作IP的类InetAddress,封装在java.net包中,该类无构造方法,直接调用静态方法获取对象

2、端口:数据要发送到对方指定的应用程序上,为了分辨这些应用程序,系统会用数字标识这些应用程序,这些数字就是端口;

                 一个程序可以对应多个端口,有效端口:0-65535,其中0-1024是系统使用或保留端口;

3、传输协议:双方之间定义的通讯规则。国际组织定义的通用协议是TCP/IP协议;

二、网络模型

1、OSI参考模型:

       1)、数据封包:应用层>会话层>网络层>物理层

       2)、数据拆包:与封包相反。

2、TCP/IP参考模型:应用层>网际层-->主机至网络层。

3、各层次所用的协议: 应用层:http协议和ftp协议;

                                        传输层:TCP协议和UDP协议;

                                        网际层:IP协议;

三、TCP和UDP协议的特点和区别

1、UDP协议特点:1) 不需要建立连接,所以不是很可靠;

                                2) 数据被封装成数据包进行传输,大小被限制在64K之内;

                                3) 优点是速度快;

                                4) 具体事例:qq聊天,视频会议等;UDP好比以前在邮局寄信,将信封好后就往地址送,至于收件人能否收到则不确定

2、TCP协议:1) 必须建立连接,形成传输的通道,所以安全可靠,但是效率比较低;

                         2) 可以进行大数据量的传输,不需要封包,所以较豪资源。

                         3) 具体事例:打电话,下载东西。

四、Socket编程

        1、Socket意思是"插座",每个应用程序都有个类似的插座,两台机器的应用程序间互相通信必须有Socket;

        2、Socket编程是为网络服务提供的一种机制,数据在俩个Socket间通过IO传输;

五、UDP传输的Socket服务建立流程

        1、UDP传输用java中提供的java.net.DatagramSocket来进行数据的接收和发送;

        2、传输数据时需要将己方或对方的地址和端口都要封装到数据包中,数据包比较复杂,所以要封装到一个对象中,这个对象是DatagramPacket;

        3、事例需求:通过UDP方式将一段文字数据发送到自己电脑上,然后接收并输出到控制台;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//创建发送类
class UdpSend
{
    public static void main(String [] args) throws Exception{
        //创建Socket
        DatagramSocket ds = new DatagramSocket();
        //把要发送的数据放入数组中
        byte [] bt = "Udp chuanshu".getBytes();
        //将数组以及要发送的地址和端口打包到数据包中
        DatagramPacket dp = new DatagramPacket(bt,bt.length,InetAddress.getByName("192.168.0.100"),10000);
        //发送
        ds.send(dp);
        ds.close();
    }
}
//创建接收类
class UdpReceive
{
    public static void main(String [] args) throws Exception{
        //创建Socket,并传入端口号
        DatagramSocket ds = new DatagramSocket(10000);
        //创建数组,用来存放接收到的数据包
        byte [] buf = new byte[1024];
        DatagramPacket dp = new DatagramPacket(buf,buf.length);
        //通过receive方法将接受的信息放到数据包中
        ds.receive(dp);
        //获取信息
        String ip = dp.getAddress().getHostAddress();
        String info = new String(dp.getData(),0,dp.getLength());
        int port = dp.getPort();       
        System.out.println("IP:"+ip+" info:"+info+" Port:"+port );
    }
}

 

        4、事例需求:用Socket将键盘录入的信息发送到自己电脑的控制台上;

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class UdpSend
{
    public static void main(String [] args) throws Exception{
        DatagramSocket ds = new DatagramSocket();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = null;
        while((line=br.readLine())!= null){
            if("88".equals(line))
                break;
            byte [] buf = line.getBytes();
            DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.100"),11002);
            ds.send(dp);
        }
        ds.close();
    }
}
   
class UdpReceive
{
    public static void main(String [] args) throws Exception{
        DatagramSocket ds = new DatagramSocket(11002);
        while(true){
            byte [] buf = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf,buf.length);
            ds.receive(dp);
            String ip = dp.getAddress().getHostAddress();
            String info = new String(dp.getData(),0,dp.getLength());
            int port = dp.getPort();       
            System.out.println("IP:"+ip+" info:"+info );
        }
    }
}

 

5:事例需求:模拟聊天软件,用多线程控制;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class UdpSend extends Thread
{
    public void run()
    {
        DatagramSocket ds = null;
        BufferedReader br = null;
        try
        {
            ds = new DatagramSocket();
            br = new BufferedReader(new InputStreamReader(System.in));
            String line = null;
            while((line=br.readLine())!= null){
                if("88".equals(line))
                    break;
                byte [] buf = line.getBytes();
                DatagramPacket dp = new DatagramPacket(buf,buf.length,InetAddress.getByName("192.168.0.100"),11002);
                ds.send(dp);
            }
        }
        catch (Exception e)
        {
            System.out.println(e.toString());
        }
        finally
        {
            try
            {
                ds.close();
            }
            catch (Exception e)
            {
                System.out.println(e.toString());
            }
        }      
    }
}
   
class UdpReceive extends Thread
{
    public void run(){
        try
        {
            DatagramSocket ds = new DatagramSocket(11002);
            while(true){
                byte [] buf = new byte[1024];
                DatagramPacket dp = new DatagramPacket(buf,buf.length);
                ds.receive(dp);
                String ip = dp.getAddress().getHostAddress();
                String info = new String(dp.getData(),0,dp.getLength());
                int port = dp.getPort();       
                System.out.println("IP:"+ip+" info:"+info );
            }
        }
        catch (Exception e1)
        {
            System.out.println(e1.toString());
        }      
    }
}
posted @ 2013-04-06 00:28  郭彦君  阅读(309)  评论(0编辑  收藏  举报