socket通信

socket通信分为tcp协议以及udp协议,

  tcp协议与udp协议的区别

  tcp没有大小限制,upd有大小限制

  udp效率更高,tcp效率不高,因为tcp每次都需要握手,而udp不需要握手

  tcp要建立连接要经历三次握手,第一次:告诉服务器,我来了;第二次:服务器收到请求后,告诉客户端,我知道了,你可以传数据了;第三次:客户端收到服务器的确认信息,告诉服务器我要开始传数据了。tcp协议传输数据是即时的,即客户端发送数据后,服务器当时就能收到数据,因此要维护连接状态。

  而udp协议并不需要三次握手,使用udp协议传数据前,客户端与服务器之间不建立连接,因此也就不需要维护连接状态。

使用tcp协议简单的创建一个数据连接服务器以及客户端

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 服务器端程序流程
 * 1.打开指定端口的服务器端对象ServerSocket
 * 2.等待客户端的连接
 * 3.读取客户端信息
 * 4.关闭连接
 */
public class SocketServer {
    public static void main(String[] args) {
        ServerSocket ss = null;
        Socket socket = null;
        try {
            /*1.创建服务器对象*/
            ss = new ServerSocket(9999);
            /*2.等待客户端的连接,如果没有客户端的连接,那么线程会一直处于阻塞状态,当有客户端连接时,程序才会向下运行*/
            socket = ss.accept();
            System.out.println("客户端ip"+socket.getInetAddress()+"发出请求");
            /*获取输出流,读取客户端发送的数据*/
            InputStream in = socket.getInputStream();
            /*创建数组对象,读取数据*/
            byte[] b = new byte[1024];
            int len =0 ;
            in.read(b);
            String s = new String(b, 0, b.length);
            System.out.println("客户端数据为:"+s);

            /*获取输入流,给客户端响应数据*/
            OutputStream out = socket.getOutputStream();
            out.write("好了好了,我知道了,不要再说了".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                ss.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }
}
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ClientDemo {
    public static void main(String[] args) {
        Socket socket = null;
        try {
            /*1.得到指定ip,指定端口的服务器端的连接*/
            socket = new Socket("127.0.0.1", 9999);
            /*获取输入流,向服务器端发送数据*/
            OutputStream out = socket.getOutputStream();
            out.write("hello world".getBytes());

            Thread.sleep(10000);

            /*获取输出流对象,读取服务器的响应*/
            InputStream in = socket.getInputStream();
            byte[] b = new byte[1024];
            int len = 0;
            while ((len = in.read(b))!=-1) {
                String s = new String(b, 0, len);
                System.out.println("服务器响应为" + s);
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

以上代码因为执行速度不一样,因此可能服务器响应前客户端就执行完了,因此可以打断点来获取服务端响应

  

原文地址:https://www.cnblogs.com/Zs-book1/p/11135070.html