zoukankan      html  css  js  c++  java
  • 应用java多线程实现server端与多client之间的通信

    应用多线程来实现server与多线程之间的通信的基本步骤

    1、server端创建ServerSocket,循环调用accept()等待client链接

    2、client创建一个Socket并请求和server端链接

    3、server端接受client请求,创建socekt与该client建立专线链接

    4、建立链接的socket在一个单独的线程上对话

    5、server继续等待新的链接

    server端Server.java
    package test.concurrent.socket;
    
    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    /**
     * Created by dong on 15-6-22.
     * 基于TCP协议的Socket通信。实现用户登录
     * 服务器端
     */
    public class Server {
    
        public static void main(String[] args) {
    
            try {
                //1、创建一个服务器端Socket,即ServerSocket, 指定绑定的端口,并监听此端口
                ServerSocket serverSocket = new ServerSocket(8888);
                Socket socket = null;
                //记录client的数量
                int count = 0;
                System.out.println("***服务器即将启动,等待client的链接***");
                //循环监听等待client的链接
                while (true){
                    //调用accept()方法開始监听,等待client的链接
                    socket = serverSocket.accept();
                    //创建一个新的线程
                    ServerThread serverThread = new ServerThread(socket);
                    //启动线程
                    serverThread.start();
    
                    count++; //统计client的数量
                    System.out.println("client的数量: " + count);
                    InetAddress address = socket.getInetAddress();
                    System.out.println("当前client的IP : " + address.getHostAddress());
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    服务器端线程处理类ServerThread.java
    package test.concurrent.socket;
    
    import java.io.*;
    import java.net.Socket;
    
    /**
     * Created by dong on 15-6-22.
     * server端线程处理类
     */
    public class ServerThread extends Thread {
    
        //和本线程相关的Socket
        Socket socket = null;
        public ServerThread(Socket socket){
            this.socket = socket;
        }
    
        //线程运行的操作,响应client的请求
        public void run(){
    
            InputStream is = null;
            InputStreamReader isr = null;
            BufferedReader br = null;
    
            OutputStream os = null;
            PrintWriter pw = null;
            try {
    
                //获取一个输入流,并读取client的信息
                is = socket.getInputStream();
                isr = new InputStreamReader(is); //将字节流转化为字符流
                br = new BufferedReader(isr); //加入缓冲
                String info = null;
                //循环读取数据
                while ((info = br.readLine()) != null){
                    System.out.println("我是server。client说: " +info);
                }
    
                socket.shutdownInput(); //关闭输入流
    
                //获取输出流。响应client的请求
                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 (is != null)
                            is.close();
                        if (isr != null)
                            isr.close();
                        if (br != null)
                            br.close();
                        if (socket != null)
                            socket.close();
                    } catch (IOException e) {
                        e.printStackTrace();
    
                    }
    
            }
    
    
    
        }
    }
    
    clientClient.java
    package test.concurrent.socket;
    
    import java.io.*;
    import java.net.Socket;
    
    /**
     * Created by dong on 15-6-22.
     * client
     */
    public class Client {
    
        public static void main(String[] args) {
    
            try {
                //1、创建clientSocket,指定server端口号和地址
                Socket socket = new Socket("localhost",8888);
                //2、获取输出流,向server发送信息
                OutputStream os = socket.getOutputStream(); //字节输出流
                PrintWriter pw  = new PrintWriter(os); //将输出流包装为打印流
                pw.write("username:tom; password:456");
                pw.flush();
                socket.shutdownOutput(); //关闭输出流
    
                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("我是client:server说:" + info);
                }
    
                br.close();
                is.close();
                isr.close();
    
    
                pw.close();
                os.close();
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    




  • 相关阅读:
    稳扎稳打Silverlight(13) 2.0交互之鼠标事件和键盘事件
    稳扎稳打Silverlight(17) 2.0数据之详解DataGrid, 绑定数据到ListBox
    再接再厉VS 2008 sp1 + .NET 3.5 sp1(2) Entity Framework(实体框架)之详解 Linq To Entities 之一
    稳扎稳打Silverlight(8) 2.0图形之基类System.Windows.Shapes.Shape
    稳扎稳打Silverlight(11) 2.0动画之ColorAnimation, DoubleAnimation, PointAnimation, 内插关键帧动画
    稳扎稳打Silverlight(21) 2.0通信之WebRequest和WebResponse, 对指定的URI发出请求以及接收响应
    稳扎稳打Silverlight(16) 2.0数据之独立存储(Isolated Storage)
    稳扎稳打Silverlight(9) 2.0画笔之SolidColorBrush, ImageBrush, VideoBrush, LinearGradientBrush, RadialGradientBrush
    稳扎稳打Silverlight(23) 2.0通信之调用WCF的双向通信(Duplex Service)
    游戏人生Silverlight(1) 七彩俄罗斯方块[Silverlight 2.0(c#)]
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5208751.html
Copyright © 2011-2022 走看看