JAVA Socket 编程学习

来源:互联网 发布:笔画笔顺查询软件 编辑:程序博客网 时间:2024/05/29 02:40

简介:


   下面是我在慕课上听完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();        }    }}

    





  

               

                        

 




原创粉丝点击