Windows系统中执行命令:
//查看占用8888端口号的进程PID netstat -aon|findstr 8888 //显示结果,找到占用8888端口号的PID TCP 0.0.0.0:8888 0.0.0.0:0 LISTENING 2696 //强制关闭(杀死) taskkill /F /pid 2696
注意,需要使用管理员的权限来运行命令窗口
Ubuntu系统中执行命令:
//查看占用8888端口号的进程PID netstat -anp | grep :8888 //显示结果,找到占用8888端口号的PID tcp 0 0 :::8888 :::* LISTEN 3626/java //强制关闭(杀死) kill -9 3626
可靠的,面向右连接的
了解客户端和服务端的步骤;
ServerSocket
:服务端
serverSocket=new ServerSocket(9909);
Socket s=serverSocket.accept();
s.getOutputStream();
s.getInputStream();
Socket
:客户端
Socket s=new Socket("127.0.0.1",9909);
案例
package com.chapter12.classcode; import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class TcpServer { //服务器端 public static void main(String[] args) { ServerSocket serverSocket=null; BufferedReader br=null; BufferedWriter bw=null; try { serverSocket=new ServerSocket(9909); System.out.println("等待客户端"); //等待客户端发送过来socket Socket s=serverSocket.accept(); System.out.println("拿到客户端的soket" + s); //读输入输出流 InputStream in = s.getInputStream(); //包装流 br=new BufferedReader(new InputStreamReader(in)); //读数据,写数据 String readLine = br.readLine();//会造成堵塞,一直等着读数据 System.out.println(readLine); // OutputStream out = s.getOutputStream(); // bw=new BufferedWriter(new OutputStreamWriter(out)); // bw.write("收到"); // bw.flush(); } catch (IOException e) { e.printStackTrace(); }finally { if (br!=null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } if (bw!=null) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } }if (serverSocket!=null) { try { serverSocket.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
package com.chapter12.classcode; import java.io.*; import java.net.Socket; public class TcpClient { //客户端 public static void main(String[] args) { BufferedWriter bw=null; BufferedReader br=null; OutputStream os=null; Socket s=null; //创建socket try { s=new Socket("127.0.0.1",9909); //给服务器端写数据 os=s.getOutputStream(); //包装流 先把字节流转换成字符流 bw=new BufferedWriter(new OutputStreamWriter(os)); //读写数据 bw.write("hello world bw.flush(); /* InputStream in = s.getInputStream(); br=new BufferedReader(new InputStreamReader(in)); String s1 = br.readLine(); System.out.println(s1);*/ } catch (IOException e) { e.printStackTrace(); }finally { if (os!=null) { try { os.close(); } catch (IOException e) { e.printStackTrace(); } }if (bw!=null) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } }if (br!=null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } if (s!=null) { try { s.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
先启动服务端,服务端会等待客户端启动然后建立连接,再启动客户端,
结果如下:
面向无连接的,不可靠的,高效率;
在UDP通信协议下,两台计算机之间进行数据交互,并不需要先建立连接,客户端直接往指定的IP和端 口号上发送数据即可,但是它并不能保证数据一定能让对方收到。
java.net.DatagramSocket
和 java.net.DatagramPacket
是UDP编程中使用到的俩个类,客户端 和服务器端都使用这个俩类
java.net.DatagramSocket
负责接收和发送数据
java.net.DatagramPacket
负责封装要发送的数据和接收到的数据
URI(uniform resource identifier),统一资源标识符,用来唯一的标识一个资源。
URL(uniform resource locator),统一资源定位符,它是一种具体的URI,即URL可以用来标识一个资 源,而且还指明了如何定位这个资源。
例如,http://127.0.0.1/hello ,这就是一个URL,它不仅标识了一个资源,还能定位这个资源。
例如,/hello ,这就是一个URI,它只是标识了一个资源。