应用java多线程实现服务器端与多客户端之间的通信

来源:互联网 发布:sqlyog软件使用方法 编辑:程序博客网 时间:2024/05/12 14:14

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

1、服务器端创建ServerSocket,循环调用accept()等待客户端链接

2、客户端创建一个Socket并请求和服务器端链接

3、服务器端接受客户端请求,创建socekt与该客户端建立专线链接

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

5、服务器继续等待新的链接

服务器端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;            //记录客户端的数量            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();        }    }}
服务器端线程处理类ServerThread.java
package test.concurrent.socket;import java.io.*;import java.net.Socket;/** * Created by dong on 15-6-22. * 服务器端线程处理类 */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();  //将缓存输出        } 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();                }        }    }}
客户端Client.java
package test.concurrent.socket;import java.io.*;import java.net.Socket;/** * Created by dong on 15-6-22. * 客户端 */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("用户名:tom; 密码: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("我是客户端:服务器说:" + info);            }            br.close();            is.close();            isr.close();            pw.close();            os.close();            socket.close();        } catch (IOException e) {            e.printStackTrace();        }    }}




0 0
原创粉丝点击