JAVA Socket 编程学习

简介:


   下面是我在慕课上听完JAVA Socket课程后的学习总结,需要的小伙伴可以看下


工具:IntelliJ IDEA


1. Socket 通信


  Java Socket 实现客户端--服务器间的双向实时通信。java.net包中定义的两个类socket和ServerSocket,分别用来实现双向连接的client和server端。


                

2. Socket 通信实现方法

   2.1  服务器端(非多线程) 

     ① 创建ServerSocket对象,绑定监听端口

     ② 通过accept()方法监听客户端请求

     ③ 连接建立后,通过输入流读取客户端发送的请求信息

     ④ 通过输出流向客户端发送相应信息

     ⑤ 关闭相关资源

代码实现类:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 基于TCP 协议的Socket通信,实现用户登录
 * 服务器端
 * Created by Administrator on 2017/9/28.
 */
public class TestServerSocket  {
    public static void main(String[] args) {

        ServerSocket serverSocket= null;
        Socket socket=null;
        try {
            //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            serverSocket = new ServerSocket(8888);
            System.out.println("***服务器即将启动,等待客户端的连接");

            //2、调用accept()方法开始监听,等待客户端的连接
            socket=serverSocket.accept();



            //3、获取输入流,并读取客户端信息
            InputStream inputStream=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
            String data=null;
            while((data=br.readLine())!=null)
            {
                System.out.println("我是服务器,客户端说:"+data);
            }

            socket.shutdownInput();//关闭输入流

            //4、获取输出流,响应客户端的请求
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);
            pw.write("欢迎你!");
            pw.flush();

            //关闭资源
            pw.close();
            os.close();


            br.close();
            inputStream.close();
            socket.close();
            serverSocket.close();

        } catch (IOException e) {
            e.printStackTrace();
        }


    }
}
         
   2.2  客户端
  

    ① 创建Socket对象,指明需要连接的服务器的地址和端口号

    ② 连接建立后,通过输出流想服务器端发送请求信息

    ③ 通过输入流获取服务器响应的信息

    ④ 关闭响应资源

代码实现类:

import java.io.*;
import java.net.Socket;

/**
 * 客户端
 * Created by Administrator on 2017/9/28.
 */
public class TestSocket {
    public static void main(String[] args) {

        try {
            //1、创建客户端Socket,指定服务器地址和端口
            Socket socket=new Socket("localhost",8888);

            //2、获取输出流,向服务器端发送信息
            OutputStream outputStream=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(outputStream);
            pw.write("用户名:admin;密码:123");
            pw.flush();
            socket.shutdownInput();

            //3、获取输入流,并读取服务器端的响应信息
            InputStream inputStream=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
            String data=null;
            while((data=br.readLine())!=null)
            {
                System.out.println("我是客户端,服务器说:"+data);
            }

            //关闭资源
            br.close();
            inputStream.close();


            pw.close();
            outputStream.close();
            socket.close();
            }
        catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.应用多线程实现服务器与多客户端之间的通信
     
   3.1新建服务器端线程处理类
    
import java.io.*;
import java.net.Socket;

/**
 * 服务器端线程处理类
 * Created by Administrator on 2017/9/28.
 */
public class ServerThread extends Thread {

    //和本线程相关的socket
    Socket socket = null;
    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    public void run() {
        //服务器处理代码
        //3、获取输入流,并读取客户端信息
        InputStream inputStream = null;
        BufferedReader br = null;
        OutputStream os = null;
        PrintWriter pw = null;
        try {
            inputStream = socket.getInputStream();
            br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
            String data = null;
            while ((data = br.readLine()) != null) {
                System.out.println("我是服务器,客户端说:" + data);
            }

            socket.shutdownInput();//关闭输入流
            
            //4、获取输出流,响应客户端的请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎你!");
            pw.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //关闭资源
            try {
                if (pw != null) {
                    pw.close();
                }
                if (os != null) {
                    os.close();
                }

                if (br != null) {
                    br.close();
                }
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
  

      3.2 服务器端 (多线程)

     ① 服务器端创建ServerSocket,循环调用accept()等待客户端连接
     ②客户端创建一个socket并请求和服务器端连接
     服务器端接受客户端请求,创建socket与该客户建立专线连接

     ④ 建立连接的两个socket在一个单独的线程上对话

     ⑤ 服务器端继续等待新的连接 

代码实现类:

   

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 服务器端(多线程)
 * Created by Administrator on 2017/9/28.
 */
public class ThreadServerSocket {
    public static void main(String[] args) {

        try {
            //1、创建一个服务器端Socket,即ServerSocket,指定绑定的端口,并监听此端口
            ServerSocket serverSocket = new ServerSocket(8888);
            Socket socket = null;

            //记录客户端的数量
            int count = 0;
            System.out.println("***服务器即将启动,等待客户端的连接");
            //循环监听等待客户端的连接
            while (true) {
                //调用accept()方法开始监听,等待客户端的连接
                socket = serverSocket.accept();
                //创建一个新的线程
                ServerThread serverThread = new ServerThread(socket);
                //启动线程
                serverThread.start();
                count++;
                System.out.println("客户端连接的数量:" + count);
                //获取当前客户端的IP地址
                 InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

    





  

               

                        

 




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值