网络编程基础

Socket通信
* 网络编程三要素:
ip:
一个计算的标示(找到这个计算机)
端口:
应用程序都会对应一个端口,用来进行通信,有效端口:0~65535,其中0~1024系统使用或保留端口。
协议:
总共有2种协议(TCP,UDP)
UDP
把数据打成一个数据包 , 不需要建立连接
数据包的大小有限制不能超过64k
因为无连接,所以属于不可靠协议(可能丢失数据)
因为无连接 ,所以效率高
TCP
需要建立连接,形成连接通道
数据可以使用连接通道直接进行传输,无大小限制
因为有链接,所以属于可靠协议
因为有链接,所以效率低

  1. InetAddress类的概述

            为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用,此类表示互联网协议 (IP) 地址。
    

    例子:

public class InetAddressTest {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub

        //通过主机ip获取对象
        InetAddress address = InetAddress.getByName("192.168.20.12");

        System.out.println(address.getHostAddress());
        System.out.println(address.getHostName());
    }

}

UDP通信步骤:
发送端步骤:

                  UDP发送数据的步骤:
                  A:创建UDP发送数据端Socket对象
                  B:创建数据包,并给出数据,把数据打包
                  C:通过Socket对象发送数据包 
                 D:释放资源

接收端步骤:

                 UDP协议接收数据步骤:
                  A:创建UDP接收数据端Socket对象
                  B:创建一个接收数据的数据包
                  C:接收数据,数据在数据包中
                  D:解析数据包,并把数据显示在控制台
                  E:释放资源

简单的聊天室代码实现:
客户端:

public class Client implements Runnable{

    DatagramSocket ds;

    public Client(DatagramSocket ds){
        this.ds=ds;
    }

    Scanner sc = new Scanner(System.in);
    String s;

    @Override
    public void run() {
        // TODO Auto-generated method stub
        while((s=sc.next())!=null){
            byte[] buf = s.getBytes();
            int length = buf.length;
            InetAddress address = null;
            try {
                address = InetAddress.getByName("192.168.20.12");
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int port = 2333;
            DatagramPacket dp = new DatagramPacket(buf, length, address, port);
            try {
                ds.send(dp);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        ds.close();

    }

}

服务端:

public class Server implements Runnable{

    DatagramSocket ds;

    public Server(DatagramSocket ds){
        this.ds=ds;
    }



    @Override
    public void run() {
        // TODO Auto-generated method stub
        while(true){

            byte [] buf = new byte [1024];
            int length = buf.length;
            DatagramPacket dp = new DatagramPacket(buf, length);
            try {
                ds.receive(dp);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            byte[] data = dp.getData();
            int i = data.length;
            System.out.println(dp.getAddress().getHostAddress()+":"+new String(data, 0, i));

        }
    }

}

TCp通信步骤:
发送端:

             * TCP协议发送数据步骤:
             * A:创建TCP协议发送端Socket对象
             *      指定服务器IP及端口
             * B:获取输出流,并写数据
             * C:释放资源

接收端:

                 * TCP协议接收数据步骤:
                 * A:创建TCP协议接收端Socket对象
                 * B:监听客户端连接
                 * C:获取输入流,并读取数据,显示在控制台
                 * D:释放资源

例子:
客户端:

public class TcpClient {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        Socket sk = new Socket("192.168.20.12", 2345);

        OutputStream os = sk.getOutputStream();

        byte[] buf = "hello".getBytes();

        os.write(buf);

        os.close();
        sk.close();
    }

}

服务端:

public class TcpServer {

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        // TODO Auto-generated method stub
        ServerSocket ss = new ServerSocket(2345);

        Socket sk = ss.accept();

        InputStream is = sk.getInputStream();

        byte [] buf = new byte [1024];
        is.read(buf);
        System.out.println(new String(buf,0,buf.length));

        is.close();
        sk.close();
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值