java实例练习——基于TCP/IP协议的多客户端通信

  先说一下大概的思路:

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

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

  2、客户端创建一个Socket并请求与服务器端连接;

  3、服务器端接受客户端请求,创建Socket与该客户端简历专线连接;

  4、建立连接的两个Socket在一个单独的线程上对话;

  5、服务器端继续等待其他新的连接。

  闲话不多说,直接上代码:

package net;
/**
 * 1、客户端
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {

        public static void main(String[] args) {
                
                try {
                        //1、创建Socket,与服务器建立连接
                        Socket socket = new Socket("localhost", 8889);                  
                        //2、向服务器端发送消息
                        OutputStream os = socket.getOutputStream();                     
                        PrintWriter pwriter = new PrintWriter(os); //将Socket的输出字节流包装成打印流
                        pwriter.write("用户名:sysker ;  密码:sys154");
                        
                        //刷新流
                        pwriter.flush();
                        //3、关闭资源
                        socket.shutdownOutput();
                        
                        //3、获取输入流
                        InputStream inputStream = socket.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                        String getMsage=null;
                        while((getMsage=bufferedReader.readLine())!=null){
                                System.out.println("客户端正在等待响应,服务器说:"+getMsage);
                                
                        }       
                        
                        //socket.shutdownInput();
                        bufferedReader.close();
                        inputStream.close();
                        inputStreamReader.close();
                        pwriter.close();
                        os.close();                     
                        socket.close();
                } catch (UnknownHostException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

        }

}
package net;
/**
 * 2、服务器端
 */

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class ManyClientServer {

        public static void main(String[] args) {
                Socket socket = null;
                int clientCount = 0;
                try {
                        ServerSocket serverSocket = new ServerSocket(8889);
                        while(true){
                                socket = serverSocket.accept();
                                ManyClientThread manyClientThread = new ManyClientThread(socket);
                                manyClientThread.start();
                                clientCount++;
                                System.out.println("客户端数量"+clientCount);
                                System.out.println("客户端的IP地址:"+socket.getInetAddress().getHostAddress());
                        }       
                        
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }

        }

}
package net;
/**
 * 3、服务器通信线程
 */
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;

public class ManyClientThread extends Thread{
        Socket socket = null;
        BufferedReader bufferedReader = null;
        public ManyClientThread(Socket socket){
                this.socket = socket;
        }
        public void run(){
                try {                   
                        BufferedReader bufferedReader = new BufferedReader(
                                        new InputStreamReader(socket.getInputStream()));
                        String mString = null;
                        while((mString = bufferedReader.readLine())!=null){
                                System.out.println("我是服务器,客户端说"+mString);                               
                        }
                        bufferedReader.close();
                        socket.close();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }finally{
                        if(bufferedReader!=null){
                                try {
                                        bufferedReader.close();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                        if(socket!=null){
                                try {
                                        socket.close();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                                
                
                }
                
        }
}