zoukankan      html  css  js  c++  java
  • java网络编程

    Socket:套接字,用于java网络编程的接口和一种机制,用套接字中的相关函数来建立连接和完成通信,socket可以看成在两个程序进行通信连接中的一个端点。

    将区分不同应用程勋进程的三个参数1.通信的目的地IP地址 2.使用的传输层协议 3.使用的端口号与一个socket绑定。

    1.每一个socket用一个半相关描述:(协议,本地地址,本地端口)

    2.“套接字”或者“插座”(socket)也是一种软件形式的抽象,用于表达两台机器之间一个连接的“终端”。针对一个特定的连接,每台机器上都有一个“套接字”,可以想象他们之间有一条虚拟的“线缆”。线缆的每一端都插入一个“套接字”或“插座”里。

    3.套接字,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。

      应用层通过传输层进行数据通信时,TCP和UDP会遇到同时为多个应用程序进程提供并发服务的问题。多个TCP连接或多个应用程序进程可能需通过同一个TCP协议端口传输数据。为了区别不同的应用程序和连接,许多计算机操作系统为应用程序与TCP/IP协议提供了称为套接字(Socket)的接口。

    4.区分不同应用程序进程间的网络通信和连接,主要有三个参数:通信的目的IP地址、使用的传输层协议(TCP或UDP)和使用的端口号。Socket原意是“插座”。通过将这三个参数结合起来,与一个“插座”Socket绑定,应用层就可以和传输层通过套接字接口,区分来自不同应用程序进程或网络连接的通信,实现数据传输的并发服务。

    5.Socket可以看成在两个程序进行通讯连接中的一个端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket中,使这段信息能传送到其他程序中。

    基于TCP的Scoket编程

    利用TCP协议进行通信两个应用程序,有主从之分,一个称为Server,另一个称为Client。

    交互过程

      1.服务器程序创建一个ServerSocket,然后调用accept方法等待客户机来连接。

      2.客户端程序创建一个Socket并请求与服务器简历连接。

      3.刚才建立了连接的两个Socket在一个单独的线程上对话。

      4.服务器开始等待新的连接。

     1 public class Server {
     2 private static ServerSocket serverSocket;
     3 
     4     //自己请求本机访问一次。
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         try {
     8             serverSocket = new ServerSocket(8888);
     9             Socket socket = null;
    10             int count = 0;
    11             // 2.调用accep()方法开始监听,等待客户端请求。
    12             System.out.println("**服务器已经启动,等待请求**");
    13             while (true) {
    14                 socket = serverSocket.accept();
    15                 ServerThread serverThread = new ServerThread(socket);
    16                 serverThread.start();
    17                 count++;
    18                 System.out.println("当前客户端的数量是:"+count);
    19             }
    20         } catch (IOException e) {
    21             // TODO Auto-generated catch block
    22             e.printStackTrace();
    23         }
    24 
    25     }
    26 
    27 }
     1 public class Client {
     2 
     3     public static void main(String[] args) {
     4         try {
     5             // 创建客户端socket,指定服务器的地址和端口
     6             Socket socket = new Socket("192.168.74.2", 8888);
     7             // 获取输出流,字节流。
     8             OutputStream outputStream = socket.getOutputStream();
     9             PrintWriter out = new PrintWriter(outputStream);
    10             out.write("用户名:admin;密码:135");
    11             out.flush();
    12             socket.shutdownOutput();
    13             // 客户端接收服务器端响应
    14             InputStream is = socket.getInputStream();
    15             BufferedReader br = new BufferedReader(new InputStreamReader(is));
    16             String data = null;
    17             while ((data = br.readLine()) != null) {
    18                 System.out.println("我是客户端,服务器端说:" + data);
    19             }
    20             br.close();
    21             is.close();
    22             out.close();
    23             outputStream.close();
    24             socket.close();
    25         } catch (UnknownHostException e) {
    26             e.printStackTrace();
    27         } catch (IOException e) {
    28             e.printStackTrace();
    29         }
    30 
    31     }
    32 
    33 }
    public class ServerThread extends Thread {
        Socket socket = null;
    
        public ServerThread(Socket socket) {
            this.socket = socket;
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
    
            // 3.获取输入的字节流
            InputStream in = null;
            // 将字节流装换为字符流
            InputStreamReader isr = null;
            // 为字符流设置缓冲区
            BufferedReader br = null;
            // 服务器端响应
            OutputStream os = null;
            PrintWriter out = null;
            try {
                in = socket.getInputStream();
                isr = new InputStreamReader(in);
                br = new BufferedReader(isr);
                String data = null;
                while ((data = br.readLine()) != null) {
                    System.out.println("我是服务器,客户端说:" + data);
                }
                socket.shutdownInput();
                os = socket.getOutputStream();
                out = new PrintWriter(os);
                out.write("客户端,你好!");
                out.flush();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            // 关闭socket输入流
            try {
                out.close();
                os.close();
                br.close();
                isr.close();
                in.close();
                socket.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }

    基于UDP的网络传输

    public class UDPServer {
    
        private static DatagramSocket datagramSocket;
    
        public static void main(String[] args) throws IOException {
            /**
             * 服务器端接收客户端的信息
             */
            datagramSocket = new DatagramSocket(8800);
            // 2.指定字节数组用来接收数据
            byte[] bytes = new byte[1024];
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
            System.out.println("**服务器端已经启动**");
            // 3.接收客户端发送的数据
            datagramSocket.receive(packet);
            String data = null;
            data = new String(bytes, 0, packet.getLength());
            System.out.println("我是服务端,客户端的数据是:" + data);
            /**
             * 服务器端响应客户端
             */
            InetAddress address = packet.getAddress();
            int port = packet.getPort();
            byte[] bytes2 = "客户端你好!".getBytes();
            DatagramPacket packet2 = new DatagramPacket(bytes2, bytes2.length, address, port);
            DatagramSocket socket = new DatagramSocket();
            socket.send(packet2);
            socket.close();
        }
    }
    public class UDPClient {
    
        private static DatagramSocket socket;
        public static void main(String[] args) throws IOException {
            /**
             * 客户端想服务器端发送数据
             */
            InetAddress address = InetAddress.getByName("192.168.74.2");
            int port = 8800;
            byte[] bytes = "用户名:admin,密码:123".getBytes();
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
            socket = new DatagramSocket();
            socket.send(packet);
            /**
             * 客户端接收阢器端的数据
             */
    //        datagramSocket = new DatagramSocket(8800);
            // 2.指定字节数组用来接收数据
            byte[] bytes2 = new byte[1024];
            DatagramPacket packet2 = new DatagramPacket(bytes2, bytes2.length);
            // 3.接收服务器端发送的数据
            socket.receive(packet2);
            String data = null;
            data = new String(bytes2, 0, packet2.getLength());
            System.out.println("我是客户端,服务器端说:" + data);
        }
    }

    TCP是较可靠的双向流协议,可以发送任意数量的数据,提供消息确认、错误监测和错误恢复等服务。

    UDP不可靠。

  • 相关阅读:
    浅涉OPC Client
    枚举目标机器已注册的OPC服务器
    C++ DCOM服务器和C#客户端互操作完全解释
    COMException:没有注册类别(REGDB_E_CLASSNOTREG)
    网络化广播主机ZABKZ/AXT8182
    OPC 技术文档之 IOPCBrowseServerAddressSpace 的使用
    SQL Server 2008 r2 服务无法启动
    Infinova V2040 系列 大型矩阵切换/控制系统
    COM中GUID和UUID、CLSID、IID
    django 视图与网址
  • 原文地址:https://www.cnblogs.com/zhuxiaodong/p/6033063.html
Copyright © 2011-2022 走看看