Chp15 网络编程

来源:互联网 发布:铁路工程概预算软件 编辑:程序博客网 时间:2024/04/29 10:52
  • ● 网络协议及分层见文章分类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();    }}
1 6
原创粉丝点击