Chp15 网络编程

  • ● 网络协议及分层见文章分类Computer Network下的相关博客。

  • 1.什么是Socket?

    网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket,应用程序通常通过”套接字”向网络发出请求或者应答网络请求。
    Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。
    ——百度百科

  • 2.TCP编程
    ● TCP(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
    ● TCP编程的基本步骤:
    服务器端: 1.创建ServerSocket对象,并绑定端口;2.调用ServerSocket对象的accept方法,并返回一个Socket对象;3.通过Socket对象来获取输入输出流,进行数据读写;4.关闭Socket流。
    客户端: 1.创建Socket对象,并连接服务器;2.调用Socket对象的Socket流,进行数据读写;3.关闭Socket流。
    ● 注意: 1.Socket流是底层建立好的,既有输入流也有输出流,想要输入或者输出流对象,可以通过Socket来获取;2.服务器端自身不需要流,它里面装的全是资源,所以需要获取客户端对象,拿对应对象的Socket流和其通信;4.因为TCP是面向连接的,所以在运行程序时必须先开服务器端;5.服务器端通过Socket对象获取输入流,来读取客户端发来的数据。

  • ● 示例:创建一个TCP服务器和一个TCP客户端。客户端向服务器发送一个“Hello”字符串,服务器接收后,在后面增加一个“ from server”字符串,再返回给客户端。

  • 服务器端代码:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class TCPServer {

    @SuppressWarnings("resource")
    public static void main(String[] args) throws Exception {
        //服务端必须对外提供一个接口,否则客户端无法连接
        ServerSocket serverSocket = new ServerSocket(9000);
        Socket socket = serverSocket.accept();
        //通过Socket对象获取输入流,来读取客户端发来的数据
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        String line = bufferedReader.readLine();
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println(line + " from server");
        printWriter.flush();
        socket.close();
    }

}
  • 客户端代码:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class TCPClient {

    public static void main(String[] args) throws Exception {
        //连接服务器如此,连接数据库也是这样,但连接数据库的时候要用到用户名和密码
        Socket socket = new Socket("192.168.0.66", 9000);
        //客户端连接成功后,要把数据发送给服务端,使用输出流,将数据写出
        PrintWriter printWriter = new PrintWriter(socket.getOutputStream());
        printWriter.println("Hello World");
        printWriter.flush();
        BufferedReader bufferedReader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
        String line = bufferedReader.readLine();
        System.out.println(line);
        socket.close();
    }

}
  • 3.UDP编程
    ● UDP (User Datagram Protocol 用户数据报协议)是一种无连接,不可靠的协议。效率较高,在对数据传输的正确率不太关心,但又对传输效率要求较高的情况下,可以采用UDP协议,例如网络语音及视频聊天应用。
    ● UDP编程的基本步骤:
    服务器端: 1.创建DatagramSocket对象,并绑定端口;2.接收数据;3.发送数据;4.关闭Socket流。
    客户端: 1.创建DatagramSocket对象;2.发送数据;3.接收数据;4.关闭Socket流。
  • ● 注意: UDP编程需使用的两个主要类:DatagramSocket和DatagramPacket。其中DatagramSocket可以当成是一台传真机,既可以收传真,也可以发传真,而DatagramPacket则是需要传输的数据。

  • ● 示例:创建一个UDP服务器和一个UDP客户端。从客户端向服务器发送一个“hello server”,而服务器端回复客户端一个字符串“hello,client”。

  • 服务器端代码:

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UDPServer {

    public static void main(String[] args) throws Exception {
        //准备一个“传真机”,指定端口
        DatagramSocket datagramSocket = new DatagramSocket(9000);
        //准备“造纸的材料”
        byte [] buf = new byte [100];
        //用上一步的材料造一张“纸”
        DatagramPacket paper = new DatagramPacket(buf, 0, buf.length);
        //把纸放入,服务器调用datagramSocket的receive方法接收数据
        datagramSocket.receive(paper);
        //获得客户端给服务器发送的数据
        String str = new String(buf, 0, paper.getLength());
        System.out.println(str);
        //从服务器给客户端发送数据
        byte [] data = "Hello client".getBytes();
        //此次回传的datagramPacket的地址,便是收到的paper对象的getSocketAddress()的返回值
        DatagramPacket datagramPacket = new DatagramPacket(
                data, 0, data.length, paper.getSocketAddress());
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }

}
  • 客户端代码:
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class UDPClient {

    public static void main(String[] args) throws Exception {
        //准备一个“传真机”,端口由系统随机分配
        DatagramSocket datagramSocket = new DatagramSocket();
        //准备发送数据
        String str = "Hello Server";
        byte [] data = str.getBytes();
        //把data数组中的数据封装到一个DatagramPacket中
        //前三个参数表示,发送的是data数组,从数组下标为0的位置发送,发送长度为data.length个字节
        //第四个参数,是一个InetSocketAddress对象
        DatagramPacket datagramPacket = new DatagramPacket(
                data, 0, data.length, new InetSocketAddress("192.168.0.66", 9000));
        //客户端调用datagramSocket的send方法,发送datagramPacket至服务器
        datagramSocket.send(datagramPacket);

        byte [] buf = new byte [100];
        DatagramPacket paper = new DatagramPacket(buf, 0, buf.length);
        datagramSocket.receive(paper);
        String msg = new String(buf, 0, paper.getLength());
        System.out.println(msg);
        datagramSocket.close();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值