美文网首页
编程实现基于TCP的Socket通信

编程实现基于TCP的Socket通信

作者: 少冰三hun甜 | 来源:发表于2016-09-03 10:11 被阅读164次

以用户登录为例:

客户端发送用户名和密码到服务器端,然后服务器端进行响应,返回类似“欢迎登录之类的信息”

1、创建ServerSocket对象,绑定监听窗口
2、通过accept()方法监听客户端请求
3、连接建立后,通过输入流读取客户端发送的请求信息
4、通过输出流向客户端发送响应信息
5、关闭相关资源

示例代码:

public class Server {
/*
* 基于TCP的socket通信,实现用户登录
* 服务器端:
*/
   public static void main(String[] args) {
       try {
           //1、创建一个服务器Socket,即ServerSocket,指定绑定的端口,并监听此端口
           ServerSocket serverSocket=new ServerSocket(8888);
           //2、调用accept()方法开始监听,等待客户端的连接
           System.err.println("~~~服务器即将启动,等待客户端的连接~~");
           Socket socket=serverSocket.accept();
           //3、 获取输入流,并读取客户端信息
           
            InputStream is=socket.getInputStream();
            //字节输入流
            InputStreamReader isr=new InputStreamReader(is);
            //将字节流转换为字符流
            BufferedReader br=new BufferedReader(isr);
            //为输入流添加缓冲
            String info=null;//循环读取客户端的信息
            while((info=br.readLine())!=null){
                System.out.println("我是服务器,客户端说:"+info);
            }
            socket.shutdownInput();//关闭输入流
            
            //4、获取输出流,响应客户端的请求.
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);
            pw.write("欢迎登录!");
            pw.flush();
            //5、关闭资源
             os.close();
             pw.close();
            br.close();
            isr.close();
            is.close();
            serverSocket.close();
       } catch (IOException e) {
   
           e.printStackTrace();
       }

   }

}

1、创建Socket对象,指明需要连接的服务器的地址和端口号
2、连接建立后,通过输出流向服务器端发送请求信息
3、通过输入流获取服务器响应的信息
4、关闭相关资源

public class Client {
    public static void main(String[] args) {
                try {
            //1、创建客户端Socket,指定服务器地址和端口
            Socket socket=new Socket("localhost", 8888);
            //2、获取输出流,向服务器发送信息
            OutputStream os=socket.getOutputStream();
            PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
            pw.write("用户名:admin;密码:123");
            pw.flush();
            socket.shutdownOutput();//关闭输出流
            //3、获取服务器端回复的信息s 
            InputStream is=socket.getInputStream();
            InputStreamReader isr=new InputStreamReader(is);
            BufferedReader br=new BufferedReader(isr);
            String s=null;
             while((s=br.readLine())!=null){
                 System.out.println("服务器说:"+s);
             }
             socket.shutdownInput();
            //4、关闭资源
            is.close();
            isr.close();
            br.close();
            pw.close();
            os.close();
            socket.close();
        
        } catch (UnknownHostException e) {
            
            e.printStackTrace();
        } catch (IOException e) {
            
            e.printStackTrace();
        }
        
    }
}

输出结果:


进阶:

  • 使用多线程实现多客户端通信

在实际应用中往往是一个服务器同时与多个客户端实现通信,并且接受请求,实现相应的服务。



应用多线程来实现服务器与多客户端之间的通信的步骤:
1.服务器端创建SeverSocket,循环调用accept()等待客户端连接
2.服务器创建一个socket并请求和服务器端连接
3.服务器端接受客户端请求,创建socket与该客户端建立专线连接
4.建立连接的两个socket在一个单独的线程上对话
5.服务器端继续等待新的连接

代码示例:

创建一个服务器端线程
跟原本的服务器端处理的任务相似,只不过独立一个线程出来处理。主要工作是接收到客户端的请求后发做出的输出。

public class ServerThread extends Thread {
    // 和本线程相关的Socket
    Socket socket = null;

    public ServerThread(Socket socket) {
        this.socket = socket;
    }
    
    //线程执行的操作,响应客户端的请求
    public void run(){
        InputStream is=null;
        InputStreamReader isr=null;
        BufferedReader br=null;
        OutputStream os=null;
        PrintWriter pw=null;
        try {
            //获取输入流,并读取客户端信息
            is = socket.getInputStream();
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            String info=null;
            while((info=br.readLine())!=null){//循环读取客户端的信息
                System.out.println("我是服务器,客户端说:"+info);
            }
            socket.shutdownInput();//关闭输入流
            //获取输出流,响应客户端的请求
            os = socket.getOutputStream();
            pw = new PrintWriter(os);
            pw.write("欢迎您!");
            pw.flush();//调用flush()方法将缓冲输出
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            //关闭资源
            try {
                if(pw!=null)
                    pw.close();
                if(os!=null)
                    os.close();
                if(br!=null)
                    br.close();
                if(isr!=null)
                    isr.close();
                if(is!=null)
                    is.close();
                if(socket!=null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

客户端代码(依旧)

public class Client {
    public static void main(String[] args) {
        try {
            //1.创建客户端Socket,指定服务器地址和端口
            Socket socket=new Socket("localhost", 8888);
            //2.获取输出流,向服务器端发送信息
            OutputStream os=socket.getOutputStream();//字节输出流
            PrintWriter pw=new PrintWriter(os);//将输出流包装为打印流
            pw.write("用户名:alice;密码:789");
            pw.flush();
            socket.shutdownOutput();//关闭输出流
            //3.获取输入流,并读取服务器端的响应信息
            InputStream is=socket.getInputStream();
            BufferedReader br=new BufferedReader(new InputStreamReader(is));
            String info=null;
            while((info=br.readLine())!=null){
                System.out.println("我是客户端,服务器说:"+info);
            }
            //4.关闭资源
            br.close();
            is.close();
            pw.close();
            os.close();
            socket.close();
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

服务器端代码:(不断侦听,然后新建线程,做出响应,关闭资源)

public class Server {
    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);
                InetAddress address=socket.getInetAddress();
                System.out.println("当前客户端的IP:"+address.getHostAddress());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • Java socket

    Java Socket实现基于TCP和UDP多线程通信Java Socket编程

  • python10-socket

    socket网络编程 socket基于tcp、ip协议的工具 所有的网络通信都基于socketwanghzh/p/...

  • 网络编程

    网络 Socket 基于TCP协议的Socket编程 基于UDP协议的Socket编程

  • 编程实现基于TCP的Socket通信

    以用户登录为例: 客户端发送用户名和密码到服务器端,然后服务器端进行响应,返回类似“欢迎登录之类的信息” 1、创建...

  • socket

    socket编程(套接字):指的是通过代码来创建实现通信的两个端(服务器和客户端)。socket一般可以基于TCP...

  • day17-网络编程

    套接字 socket编程:指的就是通过代码来创建实现通信的两个端(服务器和客户端) socket一般可以基于TCP...

  • python进阶 Socket

    Socket:(基于TCP、IP协议的网络通信)套接字 基于Socket实现聊天机器人# 客户端import so...

  • 趣谈网络协议干货-Socket

    Socket是基于TCP和UDP协议的编程。Socket编程进行的是端到端的通信,往往意识不到中间经过多少局域网,...

  • Android Socket基于UDP协议通信

    首先我们要知道UDP通信协议是Socket通信的一种实现方式,Socket通信一般有两种通信方式:基于TCP协议、...

  • Java学习5-socket通信(2)

    基于TCP协议的socket通信 目标:了解概念,通信模型,实现socket的步骤,服务端和客户端应该做些什么 什...

网友评论

      本文标题:编程实现基于TCP的Socket通信

      本文链接:https://www.haomeiwen.com/subject/cadkettx.html