网络编程

Posted on 2013-03-18 21:32  我是王琦  阅读(218)  评论(0)    收藏  举报

 

网络编程

网络通讯三要

  • IP地址(网络中设备的标识)(本地回还地址:127.0.0.1)主机和IP地址相对应。
  • 端口(用于标识进程的逻辑地址,有效端口:0~65535 其0~1024系统使用或保留端口)
  • 传输协议(TCP,UDP)

网络通讯基本流程

1,首先找到对方的IP地址;

2,数据发送到对方指定的应用程序上(找对对应端口)。为了标示这些应用程序,所以给这些应用程序添加了数字标识。

 为了方便这些称呼着写标识,给它取了一个名字叫做“端口”。逻辑端口

3,通过通信规则。这个通讯规则称为协议。国际组织定义了通用协议(TCP/IP协议)。

 InetAddress类

此类表示互联网协议 (IP) 地址。

常用方法:

static InetAddress getByName(String name);根据给定主机名返回IP地址。

static InetAddress getLocalHost();返回本地主机

String getHostName();获取IP地址主机名

String getHostAddress;获取IP地址字符串(以文本表示形式)

传输协议UDP与TCP

UDP

  • 将数据即源和目的封装成数据包中,不需要建立连接
  • 数据会被封包,每个包的大小限制在64K以内
  • 面向无连接,是不可靠的。
  • 不需要建立连接,速度快

TCP

  • 建立连接,形成传输数据的通道
  • 在建立连接中进行大量数据传输
  • 同过三步完成连接,是可靠的协议
  • 必须建立连接,效率稍低

Socket

Socket就是为网络服务提供的一种机制,用于对IP地址和端口进行描述。可以通过这些信息来实现与其他主机进行通讯。可以接收和发送数据。通讯两端都需要有Socket

DatagramSocket类

此类表示用来发送和接收数据报包的套接字。在 DatagramSocket 上总是启用 UDP 广播发送

构造方法DatagramSocket() 构造套接字,将其绑定到本地主机的任意端口上

    DatagramSocket(int prot) 构造套接字,将其绑定到本地主机的指定端口上

DatagramPacket类

此类表示数据报包 通过此包把数据打包,来实现包投机服务

构造方法DatagramPacket(byte[] buf,int length,InetAddress address,int port) 构造方法数据包,用来将制定长度的数据发送到指定主机的指定端口上

"UDPSocket"传输数据的步骤:

1,建立Udpsocket服务

2,提供数据,并将数据封装到数据包中

3,通过Socket服务发送数据,将数据包发送出去;另一端通过Socket接受数据,拆包。

4,关闭资源

 

 例如下面的代码:实实现dos版点对点聊天(UDP)

原理:找到对方IP地址,每台计算以上建立一个发送端一个接收端服务

发送端:创建发送端服务,获取键盘录入,将键盘录取的值打包同时确定对方IP地址和端口,用发送端服务,将数据包发送出去。

接收端:确定接收端的端口,用接收端服务接受数据,拆包,获取数据,打印到控制台上。

import java.net.*;
import java.io.*;
class IPDemo
{
    public static void main(String[] args) throws Exception
    {
        //创建udp服务
        DatagramSocket ds=new DatagramSocket(88);
        //准备数据,键盘录取
        BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
        String line=null;
        while((line=bufr.readLine())!=null)
        {
            byte[] buf=line.getBytes();
            //DatagramPacket(byte[] buf, int length, InetAddress address, int port) 

            DatagramPacket dp=new DatagramPacket(buf,buf.length,InetAddress.getByName("169.254.168.130"),2001);
            ds.send(dp);
            if (line.equals("over"))
                break;
        }

        ds.close();
        bufr.close();
        
    }
}
class IPDemo2
{
    public static void main(String[] args)throws Exception
    {
        //创建udpSocket服务
        DatagramSocket ds=new DatagramSocket(2001);
        System.out.println(InetAddress.getLocalHost().getHostAddress());
        while(true)
        {
            //定义数据包
            byte[] buf=new byte[1024];
            
                
                DatagramPacket dp=new DatagramPacket(buf,buf.length);
            
                ds.receive(dp);
                String ip=dp.getAddress().getHostAddress();
                String name=dp.getAddress().getHostName();
                String data=new String(dp.getData(),0,dp.getLength());
                System.out.println("name"+name+":"+ip+"\r\n"+data);
                if("over".equals(data))
                    break;        
            //通过Socket的receieve方法将受到的数据存入包中
            
        }
        
        
    //关闭资源
    ds.close();
    }
    
    
}

 TCP传输:

TCP分客户端和服务端
 客户端对应的对象是Socket.服务端对应的对象的是SeverSocket.

 客户端:Socket
 在客户端建立Socket服务时,就可以直接连接指定主机。
 因为TCP是面向连接的,只有服务端存在,才能实现数据通信。

 步骤:
 1,创建socket服务,并指定连接的主机和端口。创建对象可以用Socket(String host,prot)
 2,  确定数据源,获取数据。
 3,指定数据目的,对应的服务端,用Socket提供的方法获取输出流。s.getOutputStream();

4,读取服务端返回的数据,数据源是服务端的输入流,用s.getInputStream()获得

5,关闭资源

 服务端:ServerSocket

步骤:
 1,服务端的Socket服务。用到SeverSocker(int port),需要绑定端口。
 2,获取连接进来的客户端对象,通过SeverSocket的accept方法获取,返回Socket
 3,客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取该客户端对象的输入流来读取发过来的数据。
 4,对数据进行处理

5,关闭资源(可选).

示例:

在客户端键盘录取文本数据,发送到服务端,返回大写的文本。

客户端:1,创建Socket服务,指定服务器IP地址,绑定端口,建立连接。

2,确定数据源,获取数据,键盘录取

3,确定数据目的端,为服端输出流,c.getOutputStream()

4,读取服务端返回的数据,数据源为服务端的输入流,c.getInputStream()

5,关闭资源。

 1 import java.io.*;
 2 import java.net.*;
 3 class TransClient
 4 {
 5     public static void main(String[] args) throws Exception
 6     {
 7         //建立Tcp服务,指定服务端IP和端口
 8         Socket s=new Socket("169.254.168.130",10003);
 9         //指定数据源,获取键盘录取
10         BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
11         //指定目的,服务端,操作的是字符,用字符输出流
12         BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
13 
14         BufferedReader bufr2=new BufferedReader(new InputStreamReader(s.getInputStream()));
15         String line=null;
16         while((line=bufr.readLine())!=null)
17         {
18             bufw.write(line);//发送数据
19             
20             bufw.newLine();
21             bufw.flush();
22             if("over".equals(line))
23                 break;
24             System.out.println("Server:---"+bufr2.readLine().toUpperCase());
25 
26         }
27         
28         s.close();
29         bufr.close();
30         
31     }
32 }

服务端:
1,创建服务端的Socket服务。用到SeverSocker(int port),需要绑定端口。
 2,获取连接进来的客户端对象,通过SeverSocket的appent方法获取,返回Socket
 3,客户端如果发送过来数据,那么服务端要使用对应的客户端对象,并获取该客户端对象的输入流来读取发过来的数据。
 4,对数据进行处理,将文本数据转换为大写。

5,关闭资源(可选).

import java.io.*;
import java.net.*;
class TransServer
{
    public static void main(String[] args) throws Exception
    {
        //创建服务端Socket服务,指定端口。
        ServerSocket ss=new ServerSocket(10003);
        //获取连接过来的客户端对象,
        Socket c=ss.accept();
        //获取客户端发过来的数据,需要输入流
        InputStream in=c.getInputStream();
        BufferedReader bufr=new BufferedReader(new InputStreamReader(in));
        BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(c.getOutputStream()));
        String line=null;
        while((line=bufr.readLine())!=null)
        {
            System.out.println(line);
            
            bufw.write(line.toUpperCase());
            bufw.newLine();
            bufw.flush();
        }

    }
}

 

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3