应用java多线程实现server端与多client之间的通信

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了应用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();
        }
    }
}




以上是关于应用java多线程实现server端与多client之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

单例模式与多线程

java并发与多线程API学习

Java多线程核心技术单例模式与多线程

Java 进程与多线程

Spark 和 MR 的区别: 多进程与多线程模型

Java 高并发与多线程;:synchronized 关键字的实现原理