socker
Socket又称“套接字”,应用程序通常通过“套接字”向网络发出请求或者应答网络请求
常用的Socket类型有两种:流式Socket和数据报式Socket,流式是一种面向连接的Socket,针对于面向连接的TCP服务应用,数据报式Socket是一种无连接的Socket,针对于无连接的UDP服务应用
TCP:比较靠谱,面向连接,比较慢
UDP:不是太靠谱,比较快
举个例子:TCP就像货到付款的快递,送到家还必须见到你人才算一整套流程。UDP就像某快递快递柜一扔就走管你收到收不到,一般直播用UDP。
TCP编程 server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 import java.net.*;import java.io.*;public class GreetingServer extends Thread { private ServerSocket serverSocket; public GreetingServer (int port) throws IOException { serverSocket = new ServerSocket (port); } public void run () { try { System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "..." ); Socket server = serverSocket.accept(); System.out.println("客户端已连接:" + server.getInetAddress()); while (true ){ BufferedReader br = new BufferedReader (new InputStreamReader (server.getInputStream())); String mess = br.readLine(); System.out.println("接受客户端:" + mess); BufferedWriter bw = new BufferedWriter (new OutputStreamWriter (server.getOutputStream())); if (mess.equals("q" )) { String str1 = "服务器返回>>bye\n" ; bw.write(str1); bw.flush(); System.out.println("服务器关闭" ); break ; } else { String str = "服务器返回>>" +mess+"\n" ; bw.write(str); bw.flush(); } } } catch (IOException e) { e.printStackTrace(); } } public static void main (String[] args) { try { Thread t = new GreetingServer (6666 ); t.run(); } catch (IOException e) { throw new RuntimeException (e); } } }
如果客户端发送内容q,那么服务器就断开连接
client
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import java.net.*;import java.io.*;import java.util.Scanner;public class GreetingClient { public static void main (String [] args) { try { Socket s = new Socket ("127.0.0.1" ,6666 ); System.out.println("客户端IP:" +s.getLocalAddress()+"端口" +s.getPort()); BufferedWriter bw = new BufferedWriter (new OutputStreamWriter (s.getOutputStream())); Scanner scanner = new Scanner (System.in); while (true ){ System.out.println("请输入发送消息内容:" ); bw.write(scanner.nextLine()+"\n" ); bw.newLine(); bw.flush(); BufferedReader br = new BufferedReader (new InputStreamReader (s.getInputStream())); String ser_msg = br.readLine(); System.out.println(ser_msg); System.out.println(s.getInetAddress().getLocalHost()+":" +s.getPort()+">>" +ser_msg); if (ser_msg.contains("bye" )) { System.out.println("客户端关闭" ); break ; } } } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
客户端输入q后,接收到服务器发送bye的内容后,服务器就主动断开链接,客户端也要关闭
http server
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 import java.io.IOException;import java.io.OutputStream;import java.net.InetSocketAddress;import com.sun.net.httpserver.HttpHandler;import com.sun.net.httpserver.HttpExchange;import com.sun.net.httpserver.HttpServer;public class SimpleHttpServer { public static void main (String[] args) throws Exception { HttpServer server = HttpServer.create(new InetSocketAddress (8000 ), 0 ); server.createContext("/get" , new GetHandler ()); server.createContext("/post" , new PostHandler ()); server.setExecutor(null ); server.start(); System.out.println("Server is listening on port 8000" ); } static class GetHandler implements HttpHandler { @Override public void handle (HttpExchange exchange) throws IOException { String requestParamValue = null ; if ("GET" .equals(exchange.getRequestMethod())) { requestParamValue = handleGetRequest(exchange); } String response = "GET request received with parameter: " + requestParamValue; sendResponse(exchange, response); } } static class PostHandler implements HttpHandler { @Override public void handle (HttpExchange exchange) throws IOException { String requestParamValue = null ; if ("POST" .equals(exchange.getRequestMethod())) { requestParamValue = handlePostRequest(exchange); } String response = "POST request received with JSON data: " + requestParamValue; sendResponse(exchange, response); } } private static String handleGetRequest (HttpExchange exchange) { return exchange.getRequestURI().getQuery(); } private static String handlePostRequest (HttpExchange exchange) throws IOException { StringBuilder sb = new StringBuilder (); int i; while ((i = exchange.getRequestBody().read()) != -1 ) { sb.append((char ) i); } return sb.toString(); } private static void sendResponse (HttpExchange exchange, String response) throws IOException { exchange.sendResponseHeaders(200 , response.length()); OutputStream os = exchange.getResponseBody(); os.write(response.getBytes()); os.close(); } }
client
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 import java.net.HttpURLConnection;import java.net.URL;import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;public class SimpleHttpClient { public static void main (String[] args) throws Exception { sendGetRequest(); sendPostRequest(); } private static void sendGetRequest () throws Exception { String url = "http://localhost:8000/get?param1=value1¶m2=value2" ; URL obj = new URL (url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("GET" ); BufferedReader in = new BufferedReader (new InputStreamReader (con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer (); while ((inputLine=in.readLine()) != null ) { response.append(inputLine); } in.close(); System.out.println("GET Response from server: " + response.toString()); } private static void sendPostRequest () throws Exception { String url = "http://localhost:8000/post" ; URL obj = new URL (url); HttpURLConnection con = (HttpURLConnection) obj.openConnection(); con.setRequestMethod("POST" ); con.setRequestProperty("Content-Type" , "application/json" ); String jsonInputString = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}" ; con.setDoOutput(true ); try (OutputStream os = con.getOutputStream()) { byte [] input = jsonInputString.getBytes("utf-8" ); os.write(input, 0 , input.length); } BufferedReader in = new BufferedReader (new InputStreamReader (con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer (); while ((inputLine = in.readLine()) != null ) { response.append(inputLine); } in.close(); System.out.println("POST Response from server: " + response.toString()); } }
1 2 GET Response from server: GET request received with parameter: param1=value1¶m2=value2 POST Response from server: POST request received with JSON data: {"name" :"John" , "age" :30 , "city" :"New York" }