• java socket编程


    TcpServer

    Server端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的处理步骤如下:

    1. 构建一个ServerSocket实例,指定本地的端口。这个socket就是用来监听指定端口的连接请求的。

    2. 调用socket的accept()方法来获得下面客户端的连接请求。通过accept()方法返回的socket实例,建立了一个和客户端的新连接。

    3.通过这个返回的socket实例获取InputStream和OutputStream,可以通过这两个stream来分别读和写数据。

    4.结束的时候调用socket实例的close()方法关闭socket连接。

    package socket;
    
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.Reader;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Server {
         
           public static void main(String args[]) throws IOException {
              //为了简单起见,所有的异常信息都往外抛
              int port = 8899;
              //定义一个ServerSocket监听在端口8899上
              ServerSocket server = new ServerSocket(port);
              //server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
              Socket socket = server.accept();
              //跟客户端建立好连接之后,我们就可以获取socket的InputStream,并从中读取客户端发过来的信息了。
              Reader reader = new InputStreamReader(socket.getInputStream());
              char chars[] = new char[64];
              int len;
              StringBuilder sb = new StringBuilder();
              while ((len=reader.read(chars)) != -1) {
                 sb.append(new String(chars, 0, len));
              }
              System.out.println("from client: " + sb);
              reader.close();
              socket.close();
              server.close();
           }
           
        }

    TcpClient端

    客户端的请求过程稍微有点不一样:

    1.构建Socket实例,通过指定的远程服务器地址和端口来建立连接。

    2.通过Socket实例包含的InputStream和OutputStream来进行数据的读写。

    3.操作结束后调用socket实例的close方法,关闭。

    package socket;
    
    import java.io.OutputStreamWriter;
    import java.io.Writer;
    import java.net.Socket;
    
    public class Client {
         
           public static void main(String args[]) throws Exception {
              //为了简单起见,所有的异常都直接往外抛
              String host = "10.21.23.144";  //要连接的服务端IP地址
              int port = 8899;   //要连接的服务端对应的监听端口
              //与服务端建立连接
              Socket client = new Socket(host, port);
              //建立连接后就可以往服务端写数据了
              Writer writer = new OutputStreamWriter(client.getOutputStream());
             
              writer.write("Hello mynona Server.");
              writer.flush();//写完后要记得flush
              writer.close();
              client.close();
           }
           
        }

    Udp:

    server端

    因为UDP协议不需要建立连接,它的过程如下:

    1. 构造DatagramSocket实例,指定本地端口。

    2. 通过DatagramSocket实例的receive方法接收DatagramPacket.DatagramPacket中间就包含了通信的内容。

    3. 通过DatagramSocket的send和receive方法来收和发DatagramPacket.

    package Udp2;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    
    public class UDPServer {
        public static void main(String args[]) throws Exception
        {
            //监听9876端口
           DatagramSocket serverSocket = new DatagramSocket(9876);
              byte[] receiveData = new byte[1024];
              byte[] sendData = new byte[1024];
              while(true)
                 {
                    //构造数据包接收数据
                    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
                    //接收数据
                    serverSocket.receive(receivePacket);
                    //解析数据
                    String sentence = new String( receivePacket.getData());
                    System.out.println("RECEIVED: " + sentence);
                  
                    InetAddress IPAddress = receivePacket.getAddress();
                    int port = receivePacket.getPort();
                    String capitalizedSentence = sentence.toUpperCase();
                    sendData = capitalizedSentence.getBytes();
                    
                    //构造发送数据包发送数据
                    DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
                    serverSocket.send(sendPacket);
                 }
        }
    }

    UdpClient:

    1. 构造DatagramSocket实例。

    2.通过DatagramSocket实例的send和receive方法发送DatagramPacket报文。

    3.结束后,调用DatagramSocket的close方法关闭。

    package Udp2;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    
    public class UDPClient {
    
         public static void main(String args[]) throws Exception
           {
              BufferedReader inFromUser =
                 new BufferedReader(new InputStreamReader(System.in));
              DatagramSocket clientSocket = new DatagramSocket();
              InetAddress IPAddress = InetAddress.getByName("localhost");
              System.out.println("IPAddress:" + IPAddress);
              byte[] sendData = new byte[1024];
              byte[] receiveData = new byte[1024];
              String sentence = inFromUser.readLine();
              sendData = sentence.getBytes();
              
              //发送数据
              DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
              clientSocket.send(sendPacket);
              
              //接收数据
              DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
              clientSocket.receive(receivePacket);
              String modifiedSentence = new String(receivePacket.getData());
              System.out.println("FROM SERVER:" + modifiedSentence);
              clientSocket.close();
           }
    }

    参考来源:http://shmilyaw-hotmail-com.iteye.com/blog/1556187

    http://haohaoxuexi.iteye.com/blog/1979837

  • 相关阅读:
    AIDL interface XXX should be declared in a file
    ubuntu下安装android sdk运行模拟器出现错误:
    C# Winform使用Windows Media Player播放多媒体整理
    Asp.Net Core IIS发布后PUT、DELETE请求错误405.0
    Js 判断浏览器类型整理
    Asp.Net Core 框架源码地址
    ASP.NET Core中使用Razor视图引擎渲染视图为字符串(转)
    Asp.Net Core 自定义设置Http缓存处理
    ASP.NET Core -中间件(Middleware)使用
    Asp.Net Core 通过自定义中间件防止图片盗链的实例(转)
  • 原文地址:https://www.cnblogs.com/mynona/p/3603465.html
Copyright © 2020-2023  润新知