server

    1. package TestDown;
    2. import java.io.*;
    3. import java.net.ServerSocket;
    4. import java.net.Socket;
    5. import java.net.SocketException;
    6. public class Server {
    7. public static void main(String[] args) throws IOException {
    8. //建立服务器端连接
    9. ServerSocket serverSocket = new ServerSocket(8888);
    10. //等待请求
    11. System.out.println("服务器启动!");
    12. //让服务器一直处于监听状态(这时服务器资源不用关闭)
    13. while(true){
    14. Socket socket = serverSocket.accept();//监听客户端发送过来信息
    15. //使用多线程提高效率。每监听到一个客户端发送消息就创建一个线程来接收信息,并处理
    16. //1.打印客户端信息(ip/端口)
    17. new Thread(new Runnable() {
    18. @Override
    19. public void run() {
    20. try{
    21. //使用字节流接收数据
    22. InputStream in = socket.getInputStream();
    23. BufferedReader br = new BufferedReader((new InputStreamReader(in,"utf-8")));
    24. //读取数据
    25. //pw.newLine();
    26. /*如果服务器端使用了BufferedReader的readLine()方法,
    27. 一定要做数据末尾添加换行符,不然readLine()将一直处于堵塞状态,服务器接收不到数据*/
    28. System.out.println("客户端ip:" + socket.getInetAddress() + "端口:" + socket.getPort() + ":"+br.readLine());
    29. } catch (SocketException s) {
    30. System.out.println("客户端"+socket.getInetAddress()+":"+socket.getPort()+"已退出!");
    31. } catch (IOException e) {
    32. e.printStackTrace();
    33. }finally {
    34. try {
    35. //服务器资源不用关闭
    36. //serverSocket.close();
    37. //关闭连接,关闭流
    38. socket.close();
    39. } catch (IOException e) {
    40. e.printStackTrace();
    41. }
    42. }
    43. }
    44. }).start();
    45. }
    46. }
    47. }

    client

    1. package TestDown;
    2. import java.io.*;
    3. import java.net.Socket;
    4. import java.net.UnknownHostException;
    5. import java.util.Scanner;
    6. /**
    7. * 客户端
    8. * 1.建立客户端
    9. * 2.连接后,通过socket中的流进行传输
    10. * 3.关闭
    11. *
    12. */
    13. public class Client {
    14. static Scanner sc = new Scanner(System.in);
    15. public static void main(String[] args) throws IOException {
    16. //添加功能,实现业务逻辑
    17. /*
    18. 1.发送信息
    19. 2.退出
    20. */
    21. //使用循环、线程实现多功能
    22. while (true){
    23. //用户选择操作
    24. System.out.println("请选择:1.发送消息 2.退出");
    25. String userInput = sc.next();
    26. switch(userInput){
    27. case "1"://发送消息
    28. send();
    29. break;
    30. case "2"://退出客户端
    31. System.exit(0);
    32. break;
    33. default:
    34. System.out.println("输入有误!请重新选择");
    35. }
    36. }
    37. }
    38. private static void send() throws IOException {
    39. //循环发送消息
    40. while (true){
    41. try{
    42. //建立客户端
    43. Socket socket = new Socket("127.0.0.1",8888);
    44. //建立连接后开始传输数据
    45. OutputStream out = socket.getOutputStream();
    46. BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out,"utf-8"));
    47. PrintWriter pw = new PrintWriter(bw);
    48. //输出数据
    49. System.out.print("发送(输入88退出):");
    50. String s = sc.next();
    51. //输入88结束程序
    52. if(s.equals("88")){
    53. System.exit(0);
    54. }
    55. pw.write(s);
    56. //pw.newLine();
    57. /*如果服务器端使用了BufferedReader的readLine()方法,
    58. 一定要做数据末尾添加换行符,不然readLine()将一直处于堵塞状态,服务器接收不到数据*/
    59. pw.flush();//使用字符流一定要刷新缓存区,不然服务器读不到数据,返回null
    60. //告诉服务器不需要发生数据了
    61. socket.shutdownOutput();
    62. socket.close();
    63. } catch (UnknownHostException e) {
    64. e.printStackTrace();
    65. } catch (UnsupportedEncodingException e) {
    66. e.printStackTrace();
    67. } catch (IOException e) {
    68. e.printStackTrace();
    69. } finally{
    70. try{
    71. //关闭
    72. //socket.close();
    73. }catch (Exception e){
    74. System.out.println(e);
    75. }
    76. }
    77. }
    78. }
    79. }