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(); } } } }
以上代码因为执行速度不一样,因此可能服务器响应前客户端就执行完了,因此可以打断点来获取服务端响应